单元测试注入@ConstructorBinding修饰的不可变ConfigurationProperties报错如何解决
报错根因
报错的核心原因是你的测试配置没有触发配置属性绑定逻辑,Spring将KeycloakConfigurationProperties识别为普通构造注入Bean,尝试从容器中查找构造方法所需的4个String类型参数,容器中没有对应Bean就抛出了该异常。
解决方案
方案1:基于@SpringBootTest调整配置
修改测试类注解,明确指定要注册的配置属性类,同时确保配置文件能被正确加载:
- 如果你希望加载
src/test/resources下的yaml配置,测试类写法如下:
@SpringBootTest @EnableConfigurationProperties(KeycloakConfigurationProperties.class) // 如果你的配置文件命名为application-test.yaml,需加下面注解激活test profile // @ActiveProfiles("test") class KeycloakTest { @MockBean Keycloak keycloak; @Autowired KeycloakConfigurationProperties keycloakConfigurationProperties; }
- 如果你不想单独维护测试配置文件,可以直接把参数内联到注解中:
@SpringBootTest(properties = { "keycloak.auth-server-url=http://localhost:8081/auth", "keycloak.realm=master", "keycloak.client-id=foo-service", "keycloak.client-secret=2f217834-1c44-4c2f-a0f1-19ff0d0bd73d" }) @EnableConfigurationProperties(KeycloakConfigurationProperties.class) class KeycloakTest { @MockBean Keycloak keycloak; @Autowired KeycloakConfigurationProperties keycloakConfigurationProperties; }
方案2:使用专用配置属性测试注解(Spring Boot 2.6+推荐)
Spring Boot提供了@ConfigurationPropertiesTest切片测试注解,专门用于测试配置属性类,比@SpringBootTest更轻量,会自动装配配置绑定相关的组件:
@ConfigurationPropertiesTest(KeycloakConfigurationProperties.class) // 同样如果用test后缀的配置文件可加@ActiveProfiles("test") class KeycloakTest { @MockBean Keycloak keycloak; @Autowired KeycloakConfigurationProperties keycloakConfigurationProperties; }
内容的提问来源于stack exchange,提问作者twobiers
相关产品推荐
相关产品推荐

