【发布时间】:2018-10-09 11:36:08
【问题描述】:
我有一个用 @Transactional 注释的 api 类,如图所示。一些方法的子集进一步用readOnly=true 注释。在编写测试时,有什么方法可以验证实际发生的事务数量?考虑如果delete 方法实现调用了exist 方法,那么在调用delete 的测试中应该只发生一个事务。但是,如果测试本身在调用 delete 之前调用了 exist 方法,那么应该会发生 2 个事务。
@Transactional
public class AnApi {
public AnEntity create(EntityData data) {...}
public void delete(Long id) {...}
@Transactional(readOnly = true)
public boolean exists(Long id) {...}
}
虽然我知道框架以这种方式运行,但最好进行测试以检测未来的任何变化并避免潜在的意外。
【问题讨论】:
-
您可以使用 Mockito 测试exist() 被调用的次数,例如 Mockito.verify(AnApi, Mockito.times(1)).exists(Any.Long.class))。是这个意思吗?
-
虽然我广泛使用 Mockito,但它不会测试发生的数据库事务的实际数量 - 而是告诉我
exist执行的次数。如果它是从类似delete之类的东西调用的,它已经打开了一个事务,我想知道它不会打开另一个。 -
你可以,但为什么?此外,如果您的测试是事务性的,它仍然是单个事务,这取决于测试。
标签: java spring spring-data-jpa spring-transactions