Spring测试环境为何要回滚事务?事务回滚后如何验证测试成功?
来自Spring文档:
访问真实数据库的测试存在一个常见问题,即它们会影响持久化存储的状态。即使使用开发数据库,状态变更也可能影响后续测试。此外,许多操作——例如插入或修改持久化数据——无法在事务之外执行(或验证)。
TestContext框架解决了这个问题。默认情况下,框架会为每个测试创建并回滚事务。你可以编写依赖事务存在的代码。如果在测试中调用事务代理对象,它们会根据配置的事务语义正确运行。此外,如果测试方法在测试管理的事务中运行时删除了指定表的内容,事务默认会回滚,数据库会恢复到测试执行前的状态。测试的事务支持由测试应用上下文中定义的PlatformTransactionManager Bean提供。
如果你希望事务提交(这种情况不常见,但在需要特定测试填充或修改数据库时偶尔有用),可以使用
@Commit注解告知TestContext框架提交事务而非回滚。
事务回滚下如何确保测试有效?
你担心的「事务提交时才会暴露的约束违反问题」,Spring测试框架其实已经覆盖到了——事务在回滚前,所有数据库操作的语法校验、约束检查都会真实执行,只是最后不把变更持久化到数据库而已。
比如你在测试里插入一条违反唯一约束的数据,数据库会立刻抛出异常,测试直接失败,根本到不了回滚那一步。也就是说,回滚只是清理测试产生的临时数据,并不会跳过任何数据库层面的校验逻辑,该触发的错误一个都不会少。
如果确实需要验证提交后的逻辑(比如触发器、事务提交时的回调),可以给测试方法加@Commit注解强制提交,或者用@Rollback(false)。这种场景适合专门测提交逻辑的用例,但用完记得清理数据,别影响其他测试。
内容的提问来源于stack exchange,提问作者mhrsalehi

