使用 REQUIRES_NEW 对事务方法进行单元测试并始终强制回滚

tre*_*eno 6 junit spring jpa spring-transactions

我想测试一种通过在循环中调用 DAO 将数据插入表的服务方法。服务方法被注释为

@Transactional(propagation = Propagation.REQUIRES_NEW)
Run Code Online (Sandbox Code Playgroud)

单元测试调用服务方法并用

@Transactional
Run Code Online (Sandbox Code Playgroud)

现在我想告诉事务,它始终应该在最后进行回滚。我不想在测试运行后手动清理数据库。

@Rollback 和 EntityManager.getTransaction().setRollbackOnly() 不起作用。我认为原因是注释和 setRollbackOnly() 仅应用于由测试方法创建的事务,而不应用于由服务方法创建的事务。

有谁知道如何解决这个问题?

Sta*_*sev 0

我认为不可能轻松回滚 REQUIRES_NEW 事务。SpringTest启动一个事务,并且它可以回滚它启动的事务。但交易并不是从内部开始的。

因此,您要么可以退回到 REQUIRED,要么编写您的测试,即使它们提交也能正常工作。如果选择后者,则可以通过随机化实现测试隔离。