如何通过Configuration类加载配置并在JUnit测试类中使用?注入为空咨询
问题解决步骤
核心问题排查
你的代码存在几个关键问题,导致products Map始终为null:
- 测试类中
@ActivePRofiles拼写错误,应为@ActiveProfiles,导致测试环境配置未被正确加载。 @ConfigurationProperties注解需要配合@EnableConfigurationProperties才能生效,否则Spring不会自动将yml中的配置绑定到Map实例。@SpringBootTest与@ContextConfiguration混用会引发上下文加载冲突,@SpringBootTest本身支持通过classes属性指定要加载的配置类。
修复方案(无需新增测试配置类)
1. 修正配置类,开启配置属性绑定
在MyConfiguration上添加@EnableConfigurationProperties,让Spring处理@ConfigurationProperties的绑定逻辑:
@Configuration @EnableConfigurationProperties public class MyConfiguration { @Bean(name = "products") @ConfigurationProperties(prefix = "sale.clearance") public Map<String,String> products() { return new HashMap<>(); } }
2. 修正测试类注解与拼写
简化测试类注解,移除重复的Runner/Extension配置,修正拼写错误,并用@MockBean管理Mock实例(替代@Mock,让Spring上下文能识别并注入到依赖类中):
@SpringBootTest(classes = MyConfiguration.class) @ActiveProfiles("test") public class MyControllerTest { @Resource(name = "products") private Map<String,String> products; @MockBean private SomeService someService; // 注入被测Controller(如果测试需要) @Autowired private MyController myController; @Test public void testProductsLoaded() { // 验证配置是否成功加载 assert products != null; assert !products.isEmpty(); } }
3. 确保测试配置文件正确放置
在src/test/resources目录下创建application-test.yml,添加对应配置项:
sale: clearance: phone: "20% off" laptop: "30% off"
可选:不修改原配置类的替代方案
如果不想改动MyConfiguration,可以直接在测试类上添加@EnableConfigurationProperties:
@SpringBootTest(classes = MyConfiguration.class) @ActiveProfiles("test") @EnableConfigurationProperties public class MyControllerTest { // ... 其余代码不变 }
内容的提问来源于stack exchange,提问作者Andulos
相关产品推荐
相关产品推荐

