Spring: 单元测试中的回滚事务

Spring: Rollback transactin in Unittest

我有一个复杂的服务方法,它从数据库加载大量数据。因为它只读取和验证数据,所以我想确保

  1. JPA(Hibernate)不浪费时间检查大持久化 更改的上下文。
  2. 没有写入数据的意外更改 到数据库。

因此在我的服务即将结束时,我有这个代码

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()

我的单元测试模拟了所有数据库访问,因此事务处理不是问题。 (我有 @SpringBootTest 的集成测试和完整的 trx 支持。)不幸的是,回滚语句在纯单元测试中失败。

有没有简单的方法让回滚语句在单元测试的情况下什么也不做?

考虑使用 @Transactional(readOnly=true) 而不是 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()

Doc

A boolean flag that can be set to true if the transaction is effectively read-only, allowing for corresponding optimizations at runtime.

现在我只写了一个很容易模拟的小组件:

@Component
public class RollBacker {

    public void setRollBackOnly() {
        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
    }

}

毕竟 TransactionAspectSupport 的单例方法使得这里的单元测试变得困难。恕我直言 TransactionAspectSupport 应该是一个 spring bean。