2015-04-17 110 views
5

我有Spring Data Rest的Spring Boot应用程序,我在集成测试中使用@WebIntegrationTest以及TestRestTemplate。用于测试的基类看起来是这样的:Spring Boot @WebIntegrationTest和TestRestTemplate - 是否可以回滚测试事务?

@RunWith(SpringJUnit4ClassRunner.class) 
@ActiveProfiles(profiles = "test") 
@SpringApplicationConfiguration(classes = Application.class) 
@Transactional 
@TransactionConfiguration 
@WebIntegrationTest("server.port: 0") 
public abstract class IntegrationTest { 

    ... 

} 

我通过使用TestRestTemplate执行POST请求的资源测试一个实体的创建。问题在于,即使认为我的测试配置为事务性的,在数据​​库上坚持实体的事务也不会回滚,因此实体在测试后仍保留在数据库中。我有种理解,因为在测试中回滚的事务与持久化实体的事务不同。

现在我的问题是,是否有任何方式回滚在测试方法中通过RestTemplate发出的请求触发的事务?

+1

我会说没有,唯一的办法就是手动删除添加的条目(春季TestContext框架作者)... –

+0

FYI:您可以安全地删除'@ TransactionConfiguration'声明:它在这里没有任何作用。 –

回答

16

有回滚通过在测试方法RestTemplate提出的 请求触发交易的任何方式?

不可以。回滚由您部署的应用程序管理的事务是不可能的。

当您使用@WebIntegrationTest@SpringApplicationConfiguration注释测试类时,Spring Boot将启动嵌入式Servlet容器并在其中部署应用程序。所以从这个意义上说,你的测试和应用程序运行在两个不同的过程中。

The Spring TestContext Framework只管理Test-managed transactions。因此,测试类中@Transactional的存在仅影响本地测试管理事务,而不影响不同过程中的事务。

正如其他人已经提到的,解决方法是在测试完成后重置数据库的状态。为此你有几个选择。有关详细信息,请参阅参考手册的Executing SQL scripts部分。

问候,

山姆

+0

谢谢你的帮助。我认为这是答案。我已经重置了数据库状态。干杯。 –

+0

最后一个问题。如果测试和应用程序在两个不同的进程中运行,如何仍然可以将其组件注入到测试类中? –

+0

当我说_不同的process_时,这可能有点误导。嵌入式容器和您的测试在相同的JVM进程中运行;但是,嵌入式Servlet容器自然会在其自己的线程池的不同线程中执行请求。由于Spring的事务支持基于'ThreadLocal's,所以不同线程的概念对于事务边界是重要的。然而'ApplicationContext'是在测试线程中启动的。因此,即使这些组件在容器的线程中执行,上下文中的组件也可以注入到您的测试中。 –

相关问题