一尘不染

如何在集成测试中使用Propagation.REQUIRES_NEW回滚嵌套事务

hibernate

我对各种服务进行了一些集成测试,这些测试扩展了以下基类:

@ContextConfiguration(locations="classpath:applicationContext-test.xml")
@TransactionConfiguration(transactionManager="txManager", defaultRollback=true)
@Transactional
public abstract class IntegrationTestBase extends AbstractTransactionalJUnit4SpringContextTests
{
    //Some setup, filling test data to a HSQLDB-database etc
}

在大多数情况下,这可以正常工作,但是我有一个服务类,该类具有定义的事务propagation=Propagation.REQUIRES_NEW。看来这些事务没有回滚(因为它们是嵌套事务,并且显然是在“外部”事务中提交的?)。至少根据测试日志,回滚“外部”(测试用例级别)事务。提交的事务弄乱了一些以后的测试,因为它们已经更改了测试数据。

我可以通过强制测试在测试之间重新创建和重新填充数据库来解决此问题,但是我的问题是,这是预期的行为还是我的测试做错了?可以强制嵌套事务从测试代码回滚吗?


阅读 320

收藏
2020-06-20

共1个答案

一尘不染

这是预期的行为,并且是使用REQUIRES_NEW的主要原因之一:

  • 能够回滚新事务,但提交外部事务
  • 能够提交新事务,但回滚外部事务

在测试之间重新填充数据库可能是最好的解决方案,我将在所有测试中使用此解决方案:这使测试可以检查一切是否正常运行,包括提交(由于刷新,延迟的约束等可能会失败)。
)。

但是您确实要回滚事务,一种解决方案是rollbackAtTheEnd向您的服务添加布尔参数,如果此参数为true,则回滚事务。

2020-06-20