小编典典

Spring Boot @WebIntegrationTest和TestRestTemplate-是否可以回滚测试事务?

spring-boot

我有一个带有Spring Data Rest的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测试方法发出的请求触发的事务?


阅读 645

收藏
2020-05-30

共1个答案

小编典典

有什么方法可以回滚通过RestTemplate测试方法发出的请求触发的交易?

不能。无法回滚已部署的应用程序管理的事务。

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

springTestContext框架
只管理测试管理的事务。因此,@Transactional您的测试类中的存在只会影响本地测试管理的事务,而不会影响处于不同过程中的事务。

正如其他人已经提到的那样,一种解决方法是在测试完成后重置数据库的状态。为此,您有几种选择。有关详细信息,请参考参考手册的“
执行SQL脚本”部分。

问候,

Sam( Spring TestContext Framework的作者

2020-05-30