集成测试中的 Spring 事务管理

Posted

技术标签:

【中文标题】集成测试中的 Spring 事务管理【英文标题】:Spring transaction management in integration tests 【发布时间】:2022-01-24 05:31:34 【问题描述】:

目前我正在阅读有关测试的 Spring Framework 文档。而且我无法正确解释以下部分:

默认情况下,框架会为每个测试创建并回滚一个事务。

原文链接:https://docs.spring.io/spring-framework/docs/current/reference/html/testing.html#testing-tx

据我了解,默认情况下,我们不需要使用@Transactional 注释来注释测试方法或类来为方法创建事务。但是我在实践中看到的是,如果我跳过使用提到的注释对方法或类进行注释 - 将不会创建事务。

【问题讨论】:

这只是一个糟糕的措辞 - 他们的意思是“默认情况下,当 TestContext 看到 @Transactional @StanislavBashkyrtsev 知道了,谢谢。 【参考方案1】:

@Transactional 注释是为了表明一个事务预计会在方法中发生。这是跨国用例的预期结果。

TestContext框架给我们带来的好处是,当它看到@Transactional注解时,如果你在测试用例中执行插入查询,那么在测试用例结束后,框架会自动滚动返回插入查询以将数据库恢复到其旧状态。这确保了所有测试用例在运行期间都具有相同的 DB 状态。否则,如果不发生这种情况,每个测试用例都会改变数据库的状态,并可能导致不需要的结果。

如果不是这种情况,我们/用户必须注意在每个测试用例之后重新创建数据库。

如果你想在发送网络请求后回滚,你可以使用@DirtiesContext 注解来重置你的上下文

【讨论】:

您当然不想重新创建上下文,这太慢了。有更好的隔离测试的方法,例如数据随机化:qala.io/blog/randomized-testing.html @sridhar 是的,我明白,问题只是将事务注释放在测试方法/类上。

以上是关于集成测试中的 Spring 事务管理的主要内容,如果未能解决你的问题,请参考以下文章

Spring集成测试不回滚

[翻译]Spring Boot 中的集成测试

在集成测试中使用 Spring @ActiveProfile

Spring启动集成测试回滚不起作用

Spring集成测试中的@Autowired和UnsatisfiedDependencyException

单元测试与 Spring 的集成测试