JUnit 5测试ConfigurationProperties遇空指针:YAML配置注入失败求助
问题排查与解决步骤
1. 启用配置属性绑定功能
你的配置类虽然加了@ConfigurationProperties和@Component,但测试环境仅通过@ContextConfiguration加载类不会自动触发配置属性绑定逻辑。需要在测试类上添加@EnableConfigurationProperties(ExcludePopulationProperties.class),明确开启该类的配置绑定能力:
@EnableConfigurationProperties(ExcludePopulationProperties.class) @ExtendWith(SpringExtension.class) class YamlTest { @Autowired private ExcludePopulationProperties excludePopulationProperties; @Test void testExternalConfiguration() { Map<String, String> map = excludePopulationProperties.getTest().getService().getComputator().getPopulation().getExclude(); assertNotNull(map); } }
2. 修复YAML文件加载问题
@TestPropertySource默认不支持加载YAML格式文件,仅能处理.properties类型。你可以选择两种方案解决:
- 方案一:改用
@SpringBootTest
Spring Boot的@SpringBootTest注解会自动扫描src/test/resources下的配置文件,无需手动指定路径。如果用环境隔离配置,只需激活对应profile即可:
@SpringBootTest(properties = {"spring.profiles.active=test"})
class YamlTest {
@Autowired private ExcludePopulationProperties excludePopulationProperties; @Test void testExternalConfiguration() { Map<String, String> map = excludePopulationProperties.getTest().getService().getComputator().getPopulation().getExclude(); assertNotNull(map); }
}
注意:将配置文件命名为`application-test.yaml`放在`src/test/resources`目录下,测试环境会优先读取该文件。 - **方案二:使用YAML配置初始化器** 若不想用`@SpringBootTest`,可通过初始化器加载YAML文件,同时修正配置文件名(去掉多余下划线): ```java @ContextConfiguration( classes = ExcludePopulationProperties.class, initializers = ConfigDataApplicationContextInitializer.class ) @EnableConfigurationProperties(ExcludePopulationProperties.class) @ExtendWith(SpringExtension.class) @TestPropertySource(properties = {"spring.config.location=classpath:application-test.yaml"}) class YamlTest { // 测试代码不变 }
3. 验证Lombok注解有效性
确认项目已正确引入Lombok依赖,且IDE安装了Lombok插件。@Data注解需要生成getter/setter方法,否则Spring无法为嵌套类(如Test、Service等)注入属性,会导致字段为null。
4. 检查配置文件路径与格式
- 确保YAML文件放在
src/test/resources目录下,而非src/main/resources(测试环境优先读取test目录资源)。 - 检查YAML缩进是否统一(用空格而非制表符),格式错误会导致配置无法被解析。
内容的提问来源于stack exchange,提问作者Paul Marcelin Bejan
相关产品推荐
相关产品推荐

