从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:排查上下文配置冲突
检查测试类或相关配置类是否存在以下情况:
- 自定义了
DataSourceInitializerBean,覆盖了Spring的默认初始化逻辑 - 使用
@TestPropertySource注解覆盖了数据库初始化相关属性
原因说明
JUnit4的SpringRunner默认会在嵌入式数据库场景下自动执行data.sql,但迁移到JUnit5+@SpringBootTest后,若测试上下文存在自定义配置(如自定义DataSource相关Bean),Spring Boot的默认初始化触发逻辑会被抑制,此时需要显式配置或通过注解指定脚本执行。
内容的提问来源于stack exchange,提问作者UncleBob
相关产品推荐
相关产品推荐

