当前位置: 首页 > 面试题库 >

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

冯阳云
2023-03-14
问题内容

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

@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。看来这些事务没有回滚(因为它们是嵌套事务,并且显然是在“外部”事务中提交的?)。至少根据测试日志,回滚“外部”(测试用例级别)事务。提交的事务弄乱了一些以后的测试,因为它们已经更改了测试数据。

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


问题答案:

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

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

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

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



 类似资料:
  • 我将此文档用于集成测试:ASP.NET核心集成测试,这是我的简化集成测试: 正如您所看到的,我正在向“/API/v1/application/acceptoffer”API发送一个HTTP请求,该API更新数据库中的一些实体,如果一切正常,则返回状态代码200。 一个解决方案是使用DbContext的单例,然后将所有测试包装在事务中,但问题是SQL不支持嵌套事务,如果API也使用事务,它将引发运行

  • 情景故事时间: 我“继承”了一个程序,一个用于访问数据库的相当简单的webservice。该程序在某个地方有一个缺陷:它试图更新一个没有更新授权的表。该程序只具有更新数据库队列的权限(Oracle),以保存谁访问了什么信息。这是不受欢迎的行为,现在我纠正了它。注意:这与这个问题本身无关,它只是导致我提出这个问题的原因。 该程序使用Spring+Hibernate来管理和访问数据和事务。 因为程序的

  • null 通过函数注入到正在进行db操作的方法中进行monkey修补,并在测试中更改此函数 通过使sql全局化来更改猴子补丁-我不太喜欢 使数据库在测试时间内不允许删除操作 上面的每个选项似乎都不理想,我应该如何编写这个测试用例?

  • 我正在努力做一个工作junit测试,以回滚在骆驼路由过程中发生的操作。 我有一个骆驼路线设置,可以监听目录。它需要一个csv文件。当csv文件出现时,它会创建新的SearchAnalytics数据。它会在csv文件中的每一行向表中添加新行。 我放的默认的Spring事务方法似乎不适用于骆驼路由上发生的操作。 下面的代码可以工作。但是它会永久保存数据,并且不会回滚插入。这意味着测试只会通过一次,除非

  • 问题内容: 我测试我的DAO和服务没有问题,但是当我测试s或s时,我想回滚事务并且不影响我的数据库。 我正在使用我的服务来管理交易。我想知道,是否有可能知道交易是否正常,但是回滚它以防止更改数据库? 这是我的测试: 问题在于该测试将失败,因为事务已回滚,但是插入正常!如果删除,则测试通过,但新记录将插入数据库。 现在可以正确测试通过,但是回滚将被忽略,并且记录将插入到数据库中。显然,我已经在myS