Spring Boot JUnit测试如何跨Maven模块访问配置YAML?
为什么主类能找到配置,测试类不行?
1. Classpath范围差异
你的MyClass属于ChildModule2_1的主代码逻辑,只要ChildModule2_1的pom.xml中声明了对ChildModule1_1的compile依赖,Maven会自动将ChildModule1_1下src/main/resources的资源合并到ChildModule2_1的主classpath中,Spring Boot启动时自然能读取到my-config.yml。
而测试代码的classpath加载逻辑虽包含依赖模块的主资源,但你的测试注解使用错误,导致Spring无法正确定位配置文件:
@TestPropertySource的properties参数是用来直接定义键值对属性,而非指定配置文件路径;要指定配置文件,需用locations或value参数。- 仅用
@ExtendWith(SpringExtension.class)不会触发Spring Boot的配置加载机制,必须结合能启动Spring上下文的注解,才能解析@ConfigurationProperties。
2. 测试上下文未正确初始化
你的测试类没有启动完整的Spring Boot上下文,导致配置文件加载逻辑未被触发,即便配置文件在classpath中,也无法被读取。
不复制配置的解决方案
方案1:修正测试注解配置
修改测试类注解,用@SpringBootTest自动加载Spring Boot上下文,同时正确指定配置文件路径:
@SpringBootTest @EnableConfigurationProperties(MyClass.class) @TestPropertySource(locations = "classpath:my-config.yml") public class MyClassTest { // 测试代码 }
如果不需要完整的Spring Boot上下文,可结合@ContextConfiguration和配置初始化器:
@ExtendWith(SpringExtension.class) @EnableConfigurationProperties(MyClass.class) @ContextConfiguration(initializers = ConfigDataApplicationContextInitializer.class) @TestPropertySource(locations = "classpath:my-config.yml") public class MyClassTest { // 测试代码 }
ConfigDataApplicationContextInitializer是Spring Boot用于加载yml格式配置的初始化器,确保配置文件能被正确解析。
方案2:确认Maven依赖正确性
检查ChildModule2_1的pom.xml,确保已正确引入ChildModule1_1的依赖(默认compile范围即可):
<dependencies> <dependency> <groupId>你的项目groupId</groupId> <artifactId>ChildModule1_1</artifactId> <version>对应版本号</version> </dependency> </dependencies>
这样Maven构建测试classpath时,会自动将ChildModule1_1的src/main/resources资源包含进来。
方案3:将配置封装为共享模块
如果多个模块都需要该配置,可将ChildModule1_1作为专门的配置共享模块,其他模块直接依赖它。这样无论是主代码还是测试代码,只要依赖该模块,就能自动访问到my-config.yml,无需额外配置路径。
内容的提问来源于stack exchange,提问作者Eduardo Mendes

