我正在运行Spring集成测试 - 因此使用@RunWith(SpringJUnit4ClassRunner.class)
进行这些测试。
其中一些测试调用使用src/main/java
注释的业务类/方法(即@Transactional
),这些类/方法操纵数据库中的数据。
我理解,如果没有另外指定,使用src/test/java
注释的测试类/方法(即SpringJUnit4ClassRunner
和@Transactional
)会自动执行回滚。
现在我想知道,当我运行集成测试时,是否还要在业务类/方法(即位于src/main/java
内)操作的数据中预期该行为(自动回滚)?
答案 0 :(得分:2)
您好运......我刚刚更新了TransactionalTestExecutionListener
的Javadoc,并做了以下说明:
测试管理的交易
测试管理的事务是通过此侦听器以声明方式管理或通过TestTransaction以编程方式管理的事务。不应将此类事务与Spring管理的事务(即,在为测试加载的ApplicationContext中由Spring直接管理的事务)或应用程序管理的事务(即,通过测试调用的应用程序代码中以编程方式管理的事务)混淆。 Spring管理和应用程序管理的事务通常会参与测试管理的事务;但是,如果Spring管理的或应用程序管理的事务配置了除REQUIRED或SUPPORTS之外的任何传播类型,则应该小心。
启用和停用交易
使用@Transactional注释测试方法会导致测试在事务中运行,默认情况下,该事务将在测试完成后自动回滚。如果使用@Transactional注释测试类,则该类层次结构中的每个测试方法都将在事务中运行。未使用@Transactional注释的测试方法(在类或方法级别)将不会在事务中运行。此外,使用@Transactional注释但传播类型设置为NOT_SUPPORTED的测试将不会在事务中运行。
声明式回滚和提交行为
默认情况下,测试完成后将自动回滚测试事务;但是,可以通过类级别@TransactionConfiguration和方法级@Rollback注释以声明方式配置事务提交和回滚行为。
但请注意,TestTransaction
是Spring Framework 4.1中的一项新功能,但您可以在刚刚发布的4.1 RC1中试用它。 ;)
在您的问题的上下文中,您在src/main/java
中引用的代码将与Javadoc中提到的 Spring托管或应用程序托管的事务相关。换句话说,如果您没有任何需要新事务或暂停当前事务的应用程序代码(即测试管理事务),那么应用程序代码所做的更改也将随着测试管理而回滚事务。
此致
Sam(Spring TestContext Framework的作者)