春季:在单元测试中回滚肌动蛋白

时间:2020-09-11 05:37:06

标签: java spring spring-boot transactions spring-transactions

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

  1. JPA(休眠)不会浪费时间检查持久性 变化的环境。
  2. 不会写入对数据的意外更改 到数据库。

因此,在我服务结束时,我将获得此代码

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()

我的单元测试具有对所有数据库访问的模拟,因此事务不是问题。 (我已经使用@SpringBootTest进行了集成测试,并且还提供了完整的trx支持。)不幸的是,回滚语句在纯单元测试中失败。

是否有一种简单的方法来获取回滚语句,以防在进行单元测试时什么都不做?

2 个答案:

答案 0 :(得分:0)

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

@Component
public class RollBacker {

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

}

毕竟,TransactionAspectSupport的单例方法使这里的单元测试变得困难。恕我直言TransactionAspectSupport应该是一颗四季豆。

答案 1 :(得分:-1)

考虑使用@Transactional(readOnly=true)代替TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()

Doc

如果事务实际上是只读的,则可以将其设置为true的布尔值标志,从而允许在运行时进行相应的优化。