Spring boot 集成流测试Spring事务

Spring boot 集成流测试Spring事务,spring-boot,integration-testing,spock,spring-transactions,spring-test,Spring Boot,Integration Testing,Spock,Spring Transactions,Spring Test,我目前正在为我的Spring应用程序编写一个Spock集成测试 我想逐步使用@来执行一个与数据库交互的测试,然后在第一次测试留下的数据的基础上构建下一个测试 不幸的是,似乎每个测试方法都启动了一个新的事务,从而清除了我需要构建的数据Rollback(false)不会阻止这种行为,因为整个事务会被丢弃 下面是一个示例,MyUserService与@Repository-接口交互 逐步地 @春靴测试 @TestPropertySource(locations=“classpath:applicati

我目前正在为我的Spring应用程序编写一个Spock集成测试

我想逐步使用
@来执行一个与数据库交互的测试,然后在第一次测试留下的数据的基础上构建下一个测试

不幸的是,似乎每个测试方法都启动了一个新的事务,从而清除了我需要构建的数据
Rollback(false)
不会阻止这种行为,因为整个事务会被丢弃

下面是一个示例,
MyUserService
@Repository
-接口交互

逐步地 @春靴测试 @TestPropertySource(locations=“classpath:application test.properties”) 类MyServiceImplIntegrationFlowSpec扩展了规范{ @自动连线 @主题 MyUserService MyUserService @共享 字符串用户ID 作废“创建用户”(){ 什么时候: userId=myUserService.createUser() 然后: 用户ID } 作废“更改用户权限”(){ 什么时候: myUserService.changePermission(用户ID,“读取”) 然后: myUserService.fetchPermission()=“读取” } }

如何重用以前的测试方法创建的数据,就像通常使用
@steppwise
与数据库操作一起使用一样?

默认情况下,Spring测试框架回滚每个测试方法的数据。您可以通过将
@Commit
注释添加到您希望在数据库中保留更改的每个测试方法来更改此默认行为。如果整个测试套件应该将数据提交到数据库,我认为您可以将
@commit
注释也放在类级别

参见参考资料

它说:

在访问真实数据库的测试中,一个常见的问题是它们的影响 关于持久性存储的状态。即使您使用开发工具 数据库中,对状态的更改可能会影响将来的测试。还有很多 操作 — 例如插入或修改持久数据 — 不能 在交易之外执行(或验证)

并继续描述

TestContext框架解决了这个问题默认情况下 框架为每个测试创建并回滚一个事务。你可以 编写可以假定存在事务的代码。如果你打电话 在测试中,事务代理对象的行为正确, 根据它们配置的事务语义。此外,如果 测试方法在运行时删除选定表的内容 在为测试管理的事务中,事务滚动 默认情况下返回,数据库将返回到之前的状态 测试的执行。事务性支持由提供给测试 使用测试中定义的PlatformTransactionManager bean 应用程序上下文

如果您希望提交事务(不常见,但偶尔有用 当您希望特定测试填充或修改数据库时, 您可以告诉TestContext框架使事务 使用@commit注释提交而不是回滚

您的测试用例可能看起来像

逐步地 @春靴测试 @TestPropertySource(locations=“classpath:application test.properties”) @Commit//如果希望所有测试方法都提交到数据库 类MyServiceImplIntegrationFlowSpec扩展了规范{ @自动连线 @主题 MyUserService MyUserService @共享 字符串用户ID @提交//如果单个测试需要提交到数据库 作废“创建用户”(){ 什么时候: userId=myUserService.createUser() 然后: 用户ID } 作废“更改用户权限”(){ 什么时候: myUserService.changePermission(用户ID,“读取”) 然后: myUserService.fetchPermission()=“读取” } }