본문 바로가기
Spring/인프런 토비의 Spring Boot

섹션 7-3 [조건부 자동구성] @Conditional, Condition 학습 테스트

by include_hoany 2024. 6. 27.

@Conditional, Condition 학습 테스트

public class ConditionalTest {  
  
    @Test  
    void conditional() {  
  
        // true  
  
        // Bean 구성정보를 확인하여 테스트할 수 있는객체 ApplicationContextRunner 생성  
        ApplicationContextRunner contextRunner1 = new ApplicationContextRunner();  
  
        // Configuration 구성정보 Class를 매개변수로 넘겨주고  
        contextRunner1.withUserConfiguration(Config1.class)  
                .run(context -> {  
                    // context에 해당 빈들이 존재하는지 테스트한다.  
                    assertThat(context).hasSingleBean(MyBean.class);  
                    assertThat(context).hasSingleBean(Config1.class);  
                });  
  
  
        // false  
        ApplicationContextRunner contextRunner2 = new ApplicationContextRunner();  
        contextRunner2.withUserConfiguration(Config2.class)  
                .run(context -> {  
  
                    // doesNotHaveBean의 경우에는 존재하지않을경우를 테스트한다.  
                    assertThat(context).doesNotHaveBean(MyBean.class);  
                    assertThat(context).doesNotHaveBean(Config2.class);  
                });  
  
    }  
  
    @Retention(RetentionPolicy.RUNTIME)  
    @Target(ElementType.TYPE)  
    @Conditional(BooleanCondition.class)  
    @interface BooleanConditional {  
        boolean value();  
    }  
  
    @Configuration  
    @BooleanConditional(true)  
    static class Config1 {  
        @Bean  
        MyBean myBean() {  
            return new MyBean();  
        }  
    }  
  
    @Configuration  
    @BooleanConditional(false)  
    static class Config2 {  
        @Bean  
        MyBean myBean() {  
            return new MyBean();  
        }  
    }  
  
    static class BooleanCondition implements Condition {  
  
        @Override  
        public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {  
            // BooleanCondition 애노테이션에 매개변수로 넘겨지는 메타정보를 확인한다.  
            // BooleanConditional의 애트리뷰트 정보를 Map형태로 가져온다.  
            Map<String ,Object> annotationAttributes = metadata.getAnnotationAttributes(BooleanConditional.class.getName());  
            // value이름으로된 애트리뷰트를 가져온다.  
            Boolean value = (Boolean) annotationAttributes.get("value");  
            return value;  
        }  
    }  
  
    static class MyBean { }  
  
}

@Conditional, Condition을 통해서 Spring Container에 Bean 등록여부를 확인하는 테스트 코드 작성