2017-11-14 7 views
1

아래 예제를 보면 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 파일을 가지고,이 방법은 그것을하고 싶은 이유는 예를 들면 : (cfgcfgA이있는 " 두 개의 다른 구성 계층에 대한 "루트"개체).

cfg: 
    srvConfig: 
    name: Dude 
    clientConfig: 
    xxx: true 
    yyy: Muster 
cfgA: 
    aaaConfig: 
    bbb: false 
    ccc: Dundy 
    dddConfig: 
    fff: 3 

그것은 (getSrvConfig()@Valid에 의해 트리거) 검증의 실행 것 같은 느낌이 경우에 버그입니다.

답변

0

은 분명히이 not supported과 다른 방식으로 해결해야합니다

@Configuration 
@Conditional(MyCondition.class) 
@EnableConfigurationProperties(value = { MyConfig.class }) 
public static class TestCaseConfiguration { 
}