我正在使用Spring Boot并尝试编写一个集成测试,其中调用了一个带注释的方法:@Transactional(propagation = Propagation.REQUIRES_NEW)
。
我的测试方法带有注释:
@Test
@Transactional
@Sql(scripts = {
"/sql/insert_some_records.sql"
}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD)
使用这种配置时,我得到一个奇怪的行为,当我尝试调试时,我发现我要测试的服务bean类方法无法找到我使用sql脚本插入的记录。 @Sql
即
方法中的myRepo.findAll()
得到一个空列表。
将测试方法的传播选项更改为:
后,我设法进行了测试 @Transactional(propagation = Propagation.NEVER)
或:
@Transactional(propagation = Propagation.SUPPORTS)
并且服务类中的方法可以从数据库中正确找到所有记录,但是缺点是我必须在测试后通过脚本手动删除这些插入的记录。
我已经阅读了有关Propagation选项的Spring文档,但仍然很困惑。
谁能为我解释问题的原因是什么?为何更改传播选项后一切正常?
答案 0 :(得分:0)
在测试运行时,如果带有注释@Trasactional,它将默认创建一个事务T1,并且您的服务方法会根据REQUIRE_NEW创建另一个事务T2,因为T1尚未提交util test,T2无法看到尚未提交的数据。承诺。但是,如果test没有@Transactional,NEVER或SUPPORT,它将不会创建事务,但是sql是由jdbcTemplate.execute()执行的,它将创建一个T1并在execute()返回后立即提交。这样服务方法就可以看到数据。