You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Configuration类加载配置并在JUnit测试类中使用?注入为空咨询

问题解决步骤

核心问题排查

你的代码存在几个关键问题,导致products Map始终为null:

  1. 测试类中@ActivePRofiles拼写错误,应为@ActiveProfiles,导致测试环境配置未被正确加载。
  2. @ConfigurationProperties注解需要配合@EnableConfigurationProperties才能生效,否则Spring不会自动将yml中的配置绑定到Map实例。
  3. @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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 11:15:31