【问题标题】:Spring @Transactional - can one test the number of transactions?Spring @Transactional - 可以测试交易数量吗?
【发布时间】: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


【解决方案1】:

这应该不会太难。

Spring 使用PlatfromTransactionManager 来管理事务。 如果您通过委托给实际的事务管理器注册实现此接口的封装事务管理器,您应该能够轻松计算调用/返回的事务数。

【讨论】:

  • 我尝试了许多不同的方法来完成这项工作 - 回到这里发帖,我最终完全按照这个答案所说的去做 - 似乎是唯一的方法!
猜你喜欢
  • 1970-01-01
  • 2020-01-02
  • 2020-05-20
  • 2018-07-22
  • 1970-01-01
  • 1970-01-01
  • 2021-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多