我有一个带有Spring Data Rest的Spring Boot应用程序,并且在集成测试中@WebIntegrationTest与一起使用TestRestTemplate。测试的基类如下所示:
@WebIntegrationTest
TestRestTemplate
@RunWith(SpringJUnit4ClassRunner.class) @ActiveProfiles(profiles = "test") @SpringApplicationConfiguration(classes = Application.class) @Transactional @TransactionConfiguration @WebIntegrationTest("server.port: 0") public abstract class IntegrationTest { ... }
我正在通过使用TestRestTemplate进行POST对资源的请求测试实体的创建。问题在于,即使我的测试配置为事务性的,持久保存在数据库中的实体的事务也不会回滚,因此该实体在测试后仍保留在数据库中。我有点理解,因为在测试中回滚的事务与持久化实体的事务不同。
POST
现在我的问题是,是否有任何方法可以回滚通过RestTemplate测试方法发出的请求触发的事务?
RestTemplate
有什么方法可以回滚通过RestTemplate测试方法发出的请求触发的交易?
不能。无法回滚已部署的应用程序管理的事务。
当您使用@WebIntegrationTest和注释测试类时@SpringApplicationConfiguration,Spring Boot将启动一个嵌入式Servlet容器并在其中部署您的应用程序。因此,从这个意义上讲,您的测试和应用程序在两个不同的进程中运行。
@SpringApplicationConfiguration
在 springTestContext框架 只管理测试管理的事务。因此,@Transactional您的测试类中的存在只会影响本地测试管理的事务,而不会影响处于不同过程中的事务。
@Transactional
正如其他人已经提到的那样,一种解决方法是在测试完成后重置数据库的状态。为此,您有几种选择。有关详细信息,请参考参考手册的“ 执行SQL脚本”部分。
问候,
Sam( Spring TestContext Framework的作者 )