Spring Boot如何让集成测试正常加载src/test/resources下的integration配置文件
读不到配置文件的核心原因
Spring Boot 加载配置的逻辑从来和文件放在src/main/resources还是src/test/resources路径无直接关联,只要满足两个条件就能正常读取:一是测试运行时的类路径包含目标配置文件,二是Spring上下文激活了和配置文件后缀匹配的profile。出现移动文件后读不到的问题,基本都是三类场景导致的:
- Maven自定义资源配置时遗漏了test路径的资源加载规则,导致
src/test/resources下的文件根本没被纳入测试运行的类路径 - 集成测试运行时没有正确激活
integrationprofile,Spring Boot默认只会加载无profile后缀的基础配置文件 - 主配置中硬编码了自定义的配置扫描路径,覆盖了Spring Boot默认的类路径扫描规则
分步操作流程
1. 校验类路径的资源加载规则
Maven执行测试(含单元测试、集成测试)时,默认的类路径加载优先级为:
src/test/resources下的所有资源src/main/resources下的所有资源- 项目依赖的第三方Jar包资源
如果项目里自定义了构建的资源规则,首先检查pom.xml的配置,确认没有把test路径的资源排除。典型的错误配置反例如下:
<!-- 错误配置:完全没覆盖test路径的资源 --> <build> <resources> <resource> <directory>src/main/resources</directory> </resource> </resources> </build>
这类配置下,test路径下的文件不会被拷贝到测试运行的类路径,自然无法被识别。需要补充test专用的资源配置,写在<testResources>节点下即可,不需要改动main路径的资源规则。
2. 为集成测试单独激活integration profile
只要类路径下存在application-integration.properties文件,Spring Boot检测到integration profile被激活时就会自动加载,不需要额外指定文件路径。激活方式可以根据测试场景二选一,且不会干扰无profile要求的单元测试:
- 类级注解激活:给所有集成测试的公共基类加注解,单个测试类不需要重复配置:
@SpringBootTest @ActiveProfiles("integration") public abstract class BaseIntegrationTest { // 所有集成测试类继承该基类即可 }
- Maven插件传参激活:给负责跑集成测试的
maven-failsafe-plugin配置单独的系统属性,不需要在测试类上加任何注解:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-failsafe-plugin</artifactId> <configuration> <systemPropertyVariables> <!-- 仅集成测试运行时激活integration profile,不影响单元测试 --> <spring.profiles.active>integration</spring.profiles.active> </systemPropertyVariables> </configuration> </plugin>
3. 排查硬编码的路径覆盖问题
如果以上两步都校验无误,仍无法读取配置,检查src/main/resources下的基础application.properties文件,是否存在硬编码的配置扫描路径,比如:
# 这类配置会锁死配置加载范围,跳过默认类路径扫描 spring.config.location=classpath:/custom/main/path/ spring.config.additional-location=file:./external/config/
这类配置会让Spring Boot只去指定的路径查找配置,自然无法识别test路径下的默认规则文件。如果存在这类配置,删除或调整为兼容类路径默认扫描的写法即可。
常见避坑提示
- 既然是集成测试专用的配置,就只需要在
src/test/resources下保留一份application-integration.properties即可,不要在main路径下放同名文件,避免因为类路径优先级问题出现配置覆盖的诡异问题 - 不要用
@TestPropertySource硬编码配置文件的绝对路径,只要profile激活正确,Spring Boot会自动扫描类路径下匹配后缀的配置文件 - 不要在全局的单元测试配置里设置
integrationprofile激活,否则会让不需要Spring上下文的纯单元测试也加载集成配置,拖慢测试速度
内容的提问来源于stack exchange,提问作者PatPanda

