Spring Boot测试无法读取main下application.properties配置问题
问题原因
Spring Boot测试运行时的配置加载遵循构建工具(Maven/Gradle)的类路径优先级规则:src/test/resources下的资源优先级高于src/main/resources下的同名资源,且同名配置文件不会自动合并——只要test目录下存在application.properties,main目录下的同名文件会被直接屏蔽,不会被加载,这是这类问题最常见的诱因。
其他可能的触发原因:
- 构建配置错误,
src/main/resources没有被标记为正式资源目录,编译后没有进入测试运行的类路径 - 测试类注解配置错误,比如
@SpringBootTest指定了错误的配置路径,或者额外添加了@TestPropertySource覆盖了默认加载规则 - 多模块项目依赖关系错误,当前测试模块没有正确引入本模块main目录的资源输出
排查解决步骤
按优先级从高到低排查:
- 检查test目录下的配置文件
先查看src/test/resources路径下是否存在application.properties或application.yml文件:- 如果存在且文件里没有配置
my.key,要么把缺失的配置补到test目录的配置文件中,要么直接删除test下多余的空配置文件,main目录下的配置就会被自动加载 - 如果需要同时保留两份配置做合并,可以在test的配置文件中添加
spring.config.import=classpath:application.properties(Spring Boot 2.4+版本支持),主动引入main下的配置文件
- 如果存在且文件里没有配置
- 校验资源目录配置
以Maven项目为例,确认pom.xml中没有错误配置资源过滤规则,默认的资源配置如下,不要随意修改排除规则:
如果使用IDEA开发,打开Project Structure面板,确认<build> <resources> <resource> <directory>src/main/resources</directory> </resource> </resources> <testResources> <testResource> <directory>src/test/resources</directory> </testResource> </testResources> </build>src/main/resources被标记为Resources类型,src/test/resources被标记为Test Resources类型,标记错误时重新指定即可,修改后重新执行项目构建。 - 检查测试类注解
确认测试类上没有额外添加会修改配置加载路径的注解:比如@TestPropertySource,或者@SpringBootTest中错误配置了locations、properties参数,强行指定了其他配置文件路径,导致默认的application配置加载逻辑被覆盖。 - 验证类路径加载结果
可以在测试方法中添加如下代码,打印实际加载的application.properties路径,快速定位问题:
如果打印结果指向test编译目录(target/test-classes)下的配置文件,说明main下的配置被test同名文件覆盖;如果打印结果为null,说明main下的配置文件根本没有进入运行时类路径,回到第二步检查构建配置即可。@Test public void test() { System.out.println(getClass().getResource("/application.properties")); }
内容的提问来源于stack exchange,提问作者AntonBoarf
相关产品推荐
相关产品推荐

