有关SpringJUnit4ClassRunner的集成测试的默认回滚行为的询问

时间:2014-07-18 16:29:42

标签: spring-transactions spring-test

我正在运行Spring集成测试 - 因此使用@RunWith(SpringJUnit4ClassRunner.class)进行这些测试。

其中一些测试调用使用src/main/java注释的业务类/方法(即@Transactional),这些类/方法操纵数据库中的数据。

我理解,如果没有另外指定,使用src/test/java注释的测试类/方法(即SpringJUnit4ClassRunner@Transactional)会自动执行回滚。

现在我想知道,当我运行集成测试时,是否还要在业务类/方法(即位于src/main/java内)操作的数据中预期该行为(自动回滚)?

1 个答案:

答案 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的作者)