有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java@SpringBootTest和@Sql:脚本执行和上下文初始化的顺序

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

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

在测试上下文初始化期间,由Hibernate重新创建DB架构:

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

我希望sql脚本在上下文初始化之后和db模式生成之后执行。但是,在某些情况下clean-data-in-all-tables.sql是在模式生成之前执行的,它失败了,因为它需要尚未创建的表

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

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

它看起来像是spring boot的一个bug,但我仍然在努力找到一种解决方法。同时,我尝试了很多方法来解决这个问题,但是没有一个是有用的

请分享您对我的代码有何帮助以及可能出现的问题的看法

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

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


共 (1) 个答案

  1. # 1 楼答案

    一种可能的解决方案(我不确定您是否愿意使用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 {
    ...
    }
    

    在文件数据集中。xml您可以设置测试的初始状态等。。。 More can be found here