我正在运行Spring集成测试,因此在这些测试中使用@RunWith(SpringJUnit4ClassRunner.class)。
其中一些测试调用带有@Transactional注释的业务类/方法(即@Transactional),而这些类/方法操作数据库中的数据。
我理解使用src/test/java注释的测试类/方法(即@Transactional和SpringJUnit4ClassRunner)会自动执行回滚(如果没有其他指定的话)。
现在我想知道,当我运行集成测试时,这种行为(自动回滚)是否也被期望用于从业务类/方法(即位于src/main/java中)中操作的数据?
发布于 2014-07-19 12:26:52
你很幸运..。我刚刚用以下说明更新了TransactionalTestExecutionListener的Javadoc:
测试管理事务 测试管理事务是通过此侦听器或通过TestTransaction以编程方式以声明方式管理的事务.这类事务不应与Spring管理的事务(即由Spring直接管理的事务)或应用程序托管事务(即那些通过测试调用的应用程序代码中的托管事务)混淆。Spring管理和应用程序管理的事务通常会参与测试管理的事务;但是,如果Spring管理或应用程序管理的事务配置为除必需或支持之外的任何传播类型,则应采取谨慎措施。 启用和禁用事务 用@ transaction注释测试方法会导致测试在事务中运行,在默认情况下,该事务将在测试完成后自动回滚。如果一个测试类被@Trans手记注释,那么该类层次结构中的每个测试方法都将在一个事务中运行。在事务中不使用@ transaction (在类或方法级别上)注释的测试方法将不会运行。此外,在事务中不会运行使用@ transaction注释但将传播类型设置为NOT_SUPPORTED的测试。 声明式回滚和提交行为 默认情况下,测试事务将在测试完成后自动回滚;但是,事务性提交和回滚行为可以通过类级@TransactionConfiguration和方法级@Rollback注释以声明方式配置。
但是请注意,TestTransaction是SpringFramework4.1中的一个新特性,但是您可以在昨天刚刚发布的4.1 RC1中试用它。;)
在您的问题中,您在src/main/java中所指的代码将与Javadoc中提到的Spring管理或应用程序管理的事务相关。换句话说,如果您没有任何需要新事务或挂起当前事务(即测试管理事务)的应用程序代码,那么应用程序代码所做的更改也将与测试管理事务一起回滚。
致以敬意,
Sam ( Spring TestContext框架的作者)
https://stackoverflow.com/questions/24829823
复制相似问题