【发布时间】:2019-07-12 02:41:11
【问题描述】:
我正在使用 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)
并且服务类中的方法可以正确的从DB中找到所有记录,但缺点是测试后必须通过脚本手动删除这些插入的记录。
我已经阅读了有关传播选项的 Spring 文档,但仍然很困惑。
谁能帮我解释一下问题的原因是什么?为什么在更改传播选项后一切正常?
【问题讨论】:
-
是的,我读过,但我不明白为什么我会在测试中看到这种行为。
标签: java spring-boot spring-data-jpa spring-transactions spring-test