【问题标题】:Spring Boot Integration Test for Service method annotated with @Transactional(propagation = Propagation.REQUIRES_NEW)使用 @Transactional(propagation = Propagation.REQUIRES_NEW) 注释的 Service 方法的 Spring Boot 集成测试
【发布时间】: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


【解决方案1】:

测试运行时,如果有注解@Trasactional,默认创建一个事务T1,并且你的服务方法根据REQUIRE_NEW创建另一个事务T2,由于T1没有提交util test over,T2看不到没有提交的数据坚定的。但是如果 test 没有 @Transactional ,或者 NEVER 或 SUPPORT ,它不会创建事务,但是 sql 是由 jdbcTemplate.execute() 执行的,它会创建一个 T1 并在 execute() 返回后立即提交。所以服务方法可以看到数据。

【讨论】:

    猜你喜欢
    • 2011-10-05
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 2019-07-14
    • 2019-08-27
    • 2021-04-25
    • 2017-11-18
    相关资源
    最近更新 更多