Spring Boot Test @ConfigurationProperties не биндит в время тестов
Всем добрый вечер.
У меня есть класс, который предназначен для биндинга с properties.
В классе помеченным @Configuration я делаю бин по типу:
// В TargetConfiguration классе
@Bean("someBeanName")
@ConfigurationProperties("some.path")
public beanProperties() {
return new BeanProperties();
}
Я хотел бы протестировать всю функционально этой конфигурации и для этого создаю класс тест по типу:
@WebFluxTest
@TestPropertySource("classpath:test.properties")
@ContextConfiguration(classes = {TargetConfiguration.class})
class Test {...}
Проблема в том, что BeanProperties будет содержать нули, но если я сделаю какой-нибудь другой OtherBeanProperties и обозначу его через @EnableConfigurationProperties в TargetConfiguration, то он будет уже нормально заполнен, но для BeanProperties не могу так сделать, так как этот бин зависит от property в test.properties. И если я непоследственнов тесте через @TestConfiguration создам этот бин, то он тоже уже будет заполнен...
Любая помощь привествуется.
Ответы (1 шт):
Всему виной было @DependsOn цепопка до BeanProperties от класса, который наследует BeanDefinitionRegistryPostProcessor. Такая цепочка заставляла BeanProperties инициализиоваться до класса, который обрабатывает биндинги. Обошел я это следующим способом:
@Configuration
@ConditionalOnProperty("some.condition.property")
@EnableConfigurationProperties(BeanPropertiesConfiguration.BeanPropertiesExtender.class)
public class BeanPropertiesConfiguration {
@Validated
@ConstructorBinding
@Component("someBeanPropertiesName")
@ConditionalOnBean(BeanPropertiesConfiguration.class)
@ConfigurationProperties("some.condition.property.subpath")
public static class BeanPropertiesExtender extends BeanProperties {
public BeanPropertiesExtender(Arg1 arg1, Arg2 args)
{
super(arg1, arg2);
}
}
}
Теперь независимо от @DependsOn цепочек, BeanProperties нормально инициализируется при наличии определенных значений в Environment или не инициализируется и контекс не запускает, если парамерт не подходит.