在@WebMvcTest中导入@ConfigurationProperties类无法加载配置属性
问题原因
- @WebMvcTest切片特性的限制:@WebMvcTest默认只初始化Spring MVC相关组件(控制器、视图解析器等),不会自动启用
@ConfigurationProperties的属性绑定机制。你用@Import导入配置类时,Spring仅尝试创建该Bean,但缺少ConfigurationPropertiesBindingPostProcessor这类负责将配置文件属性绑定到Bean的核心处理器,无法从application-test.yml中读取属性值,只能通过常规依赖注入方式寻找对应String类型的Bean,自然找不到就报错。 - 默认值的兜底作用:给
version字段加默认值后,Spring可以先基于默认值创建ApplicationConfigurationBean,之后上下文里若存在配置属性绑定处理器(@WebMvcTest隐式加载的部分组件),会自动把application-test.yml中的配置值覆盖到Bean字段上,看起来能正常读取配置,但这是先创建Bean再补全属性的“曲线救国”,并非正常的属性绑定流程。
解决办法
无需使用@SpringBootTest或Mock,只需调整测试类注解,让@WebMvcTest启用配置属性绑定机制:
方法一:用@EnableConfigurationProperties替代@Import
直接在测试类上添加@EnableConfigurationProperties(ApplicationConfiguration::class),该注解会自动注册指定的@ConfigurationProperties类为Bean,同时触发配置属性绑定流程,无需额外@Import或@ConfigurationPropertiesScan:
@WebMvcTest(YourController::class) @ActiveProfiles("test") @EnableConfigurationProperties(ApplicationConfiguration::class) class YourControllerTest { // 测试代码 }
方法二:添加@ConfigurationPropertiesScan扫描配置类
若项目中有多个@ConfigurationProperties类,可在测试类上添加@ConfigurationPropertiesScan并指定配置类所在包路径,Spring会扫描并处理所有符合条件的配置类,自动完成属性绑定:
@WebMvcTest(YourController::class) @ActiveProfiles("test") @ConfigurationPropertiesScan(basePackages = ["com.yourpackage.config"]) class YourControllerTest { // 测试代码 }
这两种方式都能让@WebMvcTest正确读取application-test.yml中的配置属性,同时保持切片测试的轻量性,不会加载完整Spring上下文。
内容的提问来源于stack exchange,提问作者DarkNetFan
相关产品推荐
相关产品推荐

