我目前正在为我的春季应用程序编写SPOCK集成测试。
我想使用@Stepwise
来执行与数据库交互的测试,然后在第一个测试中留下的数据顶部进行下一个测试构建。
不幸的是,似乎为每种测试方法启动了一项新的交易,从而清除了我需要构建的数据。Rollback(false)
不能阻止此行为,因为整个交易被丢弃了Afaik。
这是一个示例,MyUserService
与@Repository
-Interface相互作用。
@Stepwise
@SpringBootTest
@TestPropertySource(locations = "classpath:application-test.properties")
class MyServiceImplIntegrationFlowSpec extends Specification {
@Autowired
@Subject
MyUserService myUserService
@Shared
String userId
void "create user"() {
when:
userId = myUserService.createUser()
then:
userId
}
void "change user permission"() {
when:
myUserService.changePermission(userId, "read")
then:
myUserService.fetchPermission() == "read"
}
}
如何通过与数据库操作结合使用@Stepwise
的前一个测试方法创建的数据?
默认情况下,弹簧测试框架将每种测试方法的数据倒退。您可以通过将@Commit
注释添加到要保留数据库中的更改的每种测试方法中来更改此默认行为。如果整个测试套件应将数据提交到数据库中,我认为您也可以将@Commit
注释也放在课堂级别上。
请参阅参考https://docs.spring.io/spring/docs/current/spring-framework-work-reference/testing.html#testesting-tx
它说:
在访问真实数据库的测试中的一个常见问题是它们的效果 在持久商店的状态下。即使您使用开发 数据库,对状态的变化可能会影响未来的测试。还有很多 操作(例如插入或修改持久数据(不能 在交易外进行(或经过验证(。
并继续描述
TestContext框架解决了此问题。默认情况下 框架为每个测试创建并回滚交易。你可以 写代码,可以假定交易的存在。如果您打电话 测试中的交易代理对象,它们的行为正确, 根据他们配置的交易语义。此外,如果 测试方法在运行时删除所选表的内容 在管理测试的交易中,交易卷 默认返回,数据库在此之前返回其状态 执行测试。通过 使用测试中定义的PlatformTransActionManager bean 应用程序上下文。
如果您想进行交易(不寻常但有时有用( 当您希望特定测试填充或修改数据库时( 您可以告诉TestContext框架使事务达到 提交而不是使用 @commit 注释。
您的测试用例看起来像
@Stepwise
@SpringBootTest
@TestPropertySource(locations = "classpath:application-test.properties")
@Commit // if you want all test methods to commit to the database
class MyServiceImplIntegrationFlowSpec extends Specification {
@Autowired
@Subject
MyUserService myUserService
@Shared
String userId
@Commit // if a single test needs to commit to the database
void "create user"() {
when:
userId = myUserService.createUser()
then:
userId
}
void "change user permission"() {
when:
myUserService.changePermission(userId, "read")
then:
myUserService.fetchPermission() == "read"
}
}