아래 예제를 보면 MyConfig.getSrvConfig()
이 호출되지 않을 것이므로 반환 된 개체에 대해 유효성 검사가 수행되지 않을 것으로 예상됩니다. 하지만 어떤 이유로 유효성 검사가 실행되고 테스트 사례가 실패합니다. 이 설정에 문제가 있습니까?조건이 컨텍스트에로드되어서는 안된다고하더라도 스프링 빈은 유효성이 검사되는 이유는 무엇입니까?
선언에서 초기화되지 않은 private MySrvConfigBean srvConfig
이있는 경우 테스트가 통과한다는 것을 알고 있습니다. 그러나 실제로 MySrvConfigBean
은 @ConfigurationProperties(prefix = "cfg.srvConfig")
주석이있는 독립 실행 형 클래스가되기를 원하지 않습니다.
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = { TestCaseConfiguration.class })
public class ConditionalConfigValidationTest {
@Autowired
private ApplicationContext applicationContext;
@Test
public void test() {
assertNotNull(applicationContext);
assertFalse("srvConfig must NOT be in context", applicationContext.containsBean("srvConfig"));
}
@Configuration
@EnableConfigurationProperties(value = { MyConfig.class })
public static class TestCaseConfiguration {
}
@Component
@Validated
@ConfigurationProperties(prefix = "cfg")
public static class MyConfig {
private MySrvConfigBean srvConfig = new MySrvConfigBean();
@Bean
@Valid
@Conditional(MyCondition.class)
public MySrvConfigBean getSrvConfig() {
return srvConfig;
}
public static class MySrvConfigBean {
@NotNull
private String name;
public String getName() {
return name;
}
}
}
public static class MyCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return false;
}
}
}
우리는 우리가 다음 코드에서 같은 방법으로 설정을 구성 할 수 있기 때문에 우리는 YAML 파일을 가지고,이 방법은 그것을하고 싶은 이유는 예를 들면 : (cfg
및 cfgA
이있는 " 두 개의 다른 구성 계층에 대한 "루트"개체).
cfg:
srvConfig:
name: Dude
clientConfig:
xxx: true
yyy: Muster
cfgA:
aaaConfig:
bbb: false
ccc: Dundy
dddConfig:
fff: 3
그것은 (getSrvConfig()
에 @Valid
에 의해 트리거) 검증의 실행 것 같은 느낌이 경우에 버그입니다.