使用Java Record作为@ConfigurationProperties时单元测试实例化失败
解决Java Record作为Spring Boot配置属性的单元测试失败问题
你的问题出在单元测试上下文的配置逻辑上:当使用@SpringJUnitConfig(DbConfig.class)时,Spring会把DbConfig当作普通Bean处理,尝试通过构造函数注入三个String类型的依赖,但这些String并没有被注册为Spring Bean,因此抛出找不到对应Bean的错误。而普通类因为有setter方法,Spring可以通过属性绑定的方式直接填充值,不需要依赖构造注入,所以测试能正常运行。
解决方案1:使用@SpringBootTest启动完整Spring Boot上下文
直接改用@SpringBootTest注解,它会自动启用Spring Boot的配置属性绑定机制,正确识别DbConfig作为配置属性类:
@TestPropertySource(locations = "classpath:application-test.properties") @SpringBootTest(classes = DbConfig.class) class DbConfigTest { @Autowired DbConfig dbConfig; @Test void shouldReturnExecutorCorrectly() { assertEquals("localhost", this.dbConfig.url()); assertEquals("Hello", this.dbConfig.username()); assertEquals("Password", this.dbConfig.password()); } }
解决方案2:自定义测试配置类
创建一个包含@EnableConfigurationProperties的配置类,让Spring正确处理DbConfig的配置属性绑定逻辑:
首先定义测试配置类:
@Configuration @EnableConfigurationProperties(DbConfig.class) public class TestConfig { }
然后修改测试类加载这个配置类:
@TestPropertySource(locations = "classpath:application-test.properties") @SpringJUnitConfig(TestConfig.class) class DbConfigTest { @Autowired DbConfig dbConfig; @Test void shouldReturnExecutorCorrectly() { assertEquals("localhost", this.dbConfig.url()); assertEquals("Hello", this.dbConfig.username()); assertEquals("Password", this.dbConfig.password()); } }
解决方案3:在测试类上直接启用配置属性
在测试类上添加@EnableConfigurationProperties注解,配合@SpringJUnitConfig使用:
@TestPropertySource(locations = "classpath:application-test.properties") @SpringJUnitConfig @EnableConfigurationProperties(DbConfig.class) class DbConfigTest { @Autowired DbConfig dbConfig; @Test void shouldReturnExecutorCorrectly() { assertEquals("localhost", this.dbConfig.url()); assertEquals("Hello", this.dbConfig.username()); assertEquals("Password", this.dbConfig.password()); } }
内容的提问来源于stack exchange,提问作者Sudhir Kumar
相关产品推荐
相关产品推荐

