You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从Junit4@RunWith(SpringRunner::class)迁移至Junit5@SpringBootTest+H2数据库遇初始化问题

解决JUnit5+@SpringBootTest下data.sql未自动加载的问题

方案1:显式开启数据库初始化开关

Spring Boot 2.5及以上版本,通过配置spring.sql.init.mode=always强制触发脚本执行,有两种配置方式:

  • 直接在测试类注解中指定:
@SpringBootTest(properties = ["spring.sql.init.mode=always"])
@ExtendWith(SpringExtension::class) // Spring Boot 2.2+ 可省略,@SpringBootTest已默认集成该扩展
class YourTestClass {
    // 测试逻辑
}
  • 在测试配置文件(src/test/resources/application-test.properties)中全局配置:
spring.sql.init.mode=always

如果是Spring Boot 2.0-2.4版本,替换为spring.datasource.initialization-mode=always。

方案2:用@Sql注解指定执行脚本

针对单测试类或测试方法,直接通过@Sql注解指定要执行的data.sql:

@SpringBootTest
@Sql("/data.sql")
class YourTestClass {
    // 测试逻辑
}

若需要控制脚本执行时机,可搭配SqlExecutionPhase:

@Sql(scripts = ["/data.sql"], executionPhase = SqlExecutionPhase.BEFORE_TEST_METHOD)

方案3:排查上下文配置冲突

检查测试类或相关配置类是否存在以下情况:

  • 自定义了DataSourceInitializer Bean,覆盖了Spring的默认初始化逻辑
  • 使用@TestPropertySource注解覆盖了数据库初始化相关属性

原因说明

JUnit4的SpringRunner默认会在嵌入式数据库场景下自动执行data.sql,但迁移到JUnit5+@SpringBootTest后,若测试上下文存在自定义配置(如自定义DataSource相关Bean),Spring Boot的默认初始化触发逻辑会被抑制,此时需要显式配置或通过注解指定脚本执行。

内容的提问来源于stack exchange,提问作者UncleBob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 07:05:25