【问题标题】:@SpringBootTest and @Transactional causes test to freeze@SpringBootTest 和 @Transactional 导致测试冻结
【发布时间】:2017-10-12 08:09:36
【问题描述】:

当组合 @SpringBootTest@Transactional 时,我的测试冻结并且永远不会恢复。

我已经建立了问题的演示here

getAgain 失败,因为 @Before 导致违反唯一约束。为了解决这个问题,我通常会包含一个@Transactional above the class,以便在每次测试后自动回滚我的更改。但是,这会导致测试冻结并且永远无法恢复。

知道为什么这两个注释不能很好地结合在一起吗?

【问题讨论】:

  • 因为你遇到了死锁。您正在启动完整的应用程序(是的,这就是 @SpringBootTest 所做的)然后您插入数据(但事务仍处于打开状态)。然后你调用一个控制器,它也试图打开一个事务(记住我告诉过你启动完整的应用程序)但是由于另一个事务没有结束它不能从表中读取。僵局。
  • 关于如何解决这个问题的任何建议?我想针对给定的一组数据使用嵌入式数据库对我的应用程序进行端到端测试。

标签: spring spring-boot spring-data-jpa spring-test spring-boot-test


【解决方案1】:

或者,您可以使用@SqlGroup 来初始化您的数据库,而不是ResourceDatabasePopulator

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@SqlGroup({
        @Sql(executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, scripts = "/testbed.sql"),
        @Sql(executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, scripts = "/clear.sql") })
public class UserControllerTest {

我已对您的示例项目进行了更改,它运行良好。 你可以在这里看到它们:springboottest-transactional

【讨论】:

    猜你喜欢
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    相关资源
    最近更新 更多