问题描述
我有一个复杂的服务方法,该方法从数据库加载大量数据。由于它只读取和验证数据,因此我想确保
- JPA(休眠)不会浪费时间检查持久性 变化的环境。
- 不会写入对数据的意外更改 到数据库。
因此,在我服务结束时,我将获得此代码
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()
我的单元测试具有对所有数据库访问的模拟,因此事务不是问题。 (我已经使用@SpringBoottest
进行了集成测试,并且还提供了完整的trx支持。)不幸的是,回滚语句在纯单元测试中失败。
是否有一种简单的方法来获取回滚语句,以防在进行单元测试时什么都不做?
解决方法
现在我只写了一个易于模拟的小组件:
@Component
public class RollBacker {
public void setRollBackOnly() {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}
毕竟,TransactionAspectSupport
的单例方法使这里的单元测试变得困难。恕我直言TransactionAspectSupport
应该是一颗四季豆。
考虑使用@Transactional(readOnly=true)
代替TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()
。
如果事务实际上是只读的,则可以将其设置为true的布尔值标志,从而允许在运行时进行相应的优化。