gpt4 book ai didi

java - @SpringBootTest 与@Sql : order of script execution and context initialization

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:24:51 26 4
gpt4 key购买 nike

我有在内存数据库上执行的集成测试。每个测试的签名大致如下所示:

@RunWith(SpringRunner.class)
@SpringBootTest
@Sql("/clean-data-in-all-tables.sql")
public class SomeTest {
@Test
public void shouldDoSomehting() {}
}

在测试上下文初始化期间,数据库模式由 Hibernate 重新创建:

spring:
jpa:
hibernate:
ddl-auto: create-drop

我希望 sql 脚本在上下文初始化后执行,并在数据库模式生成后执行。然而,在某些情况下,clean-data-in-all-tables.sql 在架构生成之前执行,并且它会失败,因为它需要尚未创建的表。

我按照我解释的方式编写了 500 多个测试,它们都运行良好,直到我添加了更多类似的测试。

当我通过 Gradle 或 IntelliJ 一起执行测试时,测试失败。 注意失败的测试不是最近添加的测试。这是与我添加的测试完全无关的旧测试。同样奇怪的是,如果我通过 IntelliJ 一个一个地运行失败的测试,它们运行良好。

它看起来像是 spring-boot 的一个错误,但我仍在尝试找到一种解决方法。与此同时,我尝试了很多方法来解决这个问题,但没有一个是有帮助的。

请分享您对我的代码有什么帮助以及可能有什么问题的想法。

更新:找到了解决方法:将 spring.jpa.hibernate.ddl-autocreate-drop 更改为 create 解决了问题。

但问题仍然悬而未决这种奇怪行为的原因是什么?

最佳答案

一个可能的解决方案(我不确定您是否愿意使用 DBUnit)可以是:

1) 创建抽象存储库集成测试:

@TestExecutionListeners({DbUnitTestExecutionListener.class})
@SpringApplicationConfiguration(classes = Application.class)
@DirtiesContext
public abstract class AbstractRepositoryIT extends AbstractTransactionalJUnit4SpringContextTests {
}

2) 创建“真正的”集成测试:

@DatabaseSetup(SomeEntityRepositoryIT.DATASET)
@DatabaseTearDown(type = DatabaseOperation.DELETE_ALL, value = {"dataset.xml})
public class SomeEntityRepositoryIT extends AbstractRepositoryIT {
...
}

在文件 dataset.xml 中,您可以为测试等设置初始状态... More can be found here

关于java - @SpringBootTest 与@Sql : order of script execution and context initialization,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43914459/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com