求助:Spring测试时错误加载main目录的data.sql,无法指定使用test目录的配置与数据文件
求助:Spring测试时错误加载main目录的data.sql,无法指定使用test目录的配置与数据文件
兄弟,我之前也踩过Spring Boot测试加载脚本的坑,给你几个实际试过有效的排查和解决方向:
1. 先确认测试的Profile真的生效了
有时候@ActiveProfiles("test")看起来加了,但实际没生效是常有的事,先把这个基础点确认了:
- 你可以在
test/resources/application.properties里加一行调试日志:
启动测试后看控制台,有没有输出类似logging.level.org.springframework.context=DEBUGLoaded environment profiles [test]的日志,确认test配置被加载。 - 或者直接在测试类里加个小代码打印激活的Profile:
如果输出里没有@Autowired private Environment env; @BeforeEach void checkActiveProfiles() { System.out.println("当前激活的Profile: " + Arrays.toString(env.getActiveProfiles())); }test,那得先解决Profile不生效的问题,比如检查测试类的包路径是否和主应用一致,有没有其他配置类覆盖了Profile。
2. 修正SQL初始化的配置(关键坑点!)
看你的测试配置里犯了一个很容易踩的错误:你用了spring.sql.init.schema-locations来指定data.sql,但这个配置是用来指定建表的Schema文件的,插入数据的文件应该用spring.sql.init.data-locations!
赶紧把test/resources/application.properties里的配置改对:
# 把schema-locations改成data-locations! spring.sql.init.data-locations=classpath:data.sql # 如果你的data.sql里是建表语句才用schema-locations,否则一定要用data-locations
另外,为了从根源避免和main目录的文件重名冲突,你可以把test目录的data.sql改名为test-data.sql,然后配置改成:
spring.sql.init.data-locations=classpath:test-data.sql
这样就完全不会和main里的文件混淆了。
3. 用@Sql注解直接强制指定脚本
如果上面的配置还是不生效,那可以直接在测试类上用@Sql注解,强制指定要加载的脚本,这个优先级很高,基本不会出错:
@DataJpaTest @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) @ActiveProfiles("test") @Sql(scripts = "classpath:data.sql") // 这里会优先加载test/resources下的data.sql public class SomeRepositoryTest { // ... 你的测试代码 }
4. 检查@DataJpaTest的自动配置冲突
@DataJpaTest默认会禁用一些自动配置类,有可能和你的SQL初始化配置冲突,你可以试试在测试类上加上@Import(SqlInitializationAutoConfiguration.class),确保SQL初始化的配置被正确加载:
@DataJpaTest @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) @ActiveProfiles("test") @Import(SqlInitializationAutoConfiguration.class) public class SomeRepositoryTest { // ... }
5. 确认构建工具的资源配置(兜底检查)
虽然一般默认没问题,但还是可以确认下Maven/Gradle有没有正确把test目录的资源打包到测试环境:
- 如果是Maven,检查
pom.xml里的testResources配置,确保是这样的(默认就是这个配置,不用改,只是确认):<build> <testResources> <testResource> <directory>src/test/resources</directory> </testResource> </testResources> </build> - 如果是Gradle,直接执行一下
clean test命令,同步下项目资源,确保test目录的文件被正确加载。
内容来源于stack exchange
相关产品推荐
相关产品推荐

