Spring Boot测试时如何仅加载application-test.yml不加载application.yml
我明白你的痛点——Spring Boot默认的配置加载逻辑会先读application.yml再读环境特定的配置,导致即使激活了test环境,默认配置还是会被加载进来。下面是几个靠谱的解决方案,亲测有效:
方案1:在测试类直接指定配置文件名称
最直接的方式是在@SpringBootTest注解里通过properties指定spring.config.name,让Spring只加载你指定的配置文件:
@SpringBootTest(properties = {"spring.config.name=application-test"}) class YourTestClass { // 你的测试代码 }
原理:spring.config.name定义了配置文件的基础名称,设置成application-test后,Spring只会查找这个名称的配置文件(比如application-test.yml、application-test.properties),完全不会去加载默认的application.yml。
方案2:使用@TestPropertySource指定配置文件路径
如果你的测试配置文件路径特殊,可以用@TestPropertySource直接指定路径:
@SpringBootTest @TestPropertySource(locations = "classpath:application-test.yml") class YourTestClass { // 你的测试代码 }
注意:如果你的application-test.yml里用到了Spring的占位符(比如${spring.application.name}),可能需要确保这些占位符有值,或者结合@ActiveProfiles一起使用,但这个方法本身已经能屏蔽默认的application.yml。
方案3:全局配置(Maven/Gradle层面)
如果所有测试类都需要只加载test配置,可以在构建工具里设置系统属性,一劳永逸:
Maven(pom.xml)
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <systemPropertyVariables> <spring.config.name>application-test</spring.config.name> </systemPropertyVariables> </configuration> </plugin> </plugins> </build>
Gradle(build.gradle)
test { systemProperty "spring.config.name", "application-test" }
这样运行测试时,Spring会自动只加载application-test.yml,不用在每个测试类上加注解。
为什么之前的配置没生效?
大概率你只加了@ActiveProfiles("test")——这个注解的作用是激活test环境的配置,让它覆盖默认配置,而不是屏蔽默认的application.yml。Spring Boot的默认加载顺序是:application.yml → application-{profile}.yml,所以默认配置还是会被先加载,然后被test配置覆盖,但不会消失。
内容的提问来源于stack exchange,提问作者ElArbi

