본문 바로가기
혼자 공부하는 것들/Spring

Spring Bean 상속관계와 테스트코드[Juint5]

by applepick 2022. 1. 10.
반응형

"모든 자바 객체 최상위 부모는 Object입니다."

일반적으로 흔히 사용하고 있는 자바 클래스들은 최상위 부모가 Object입니다.

public class ApplicationNameConfig extends Object { ... }


이런 식으로 extends Object가 생략되어 있습니다.

위의 그림 같이 상속관계를 맺고 있다고 생각하면, Spring Bean을 부모 타입으로 조회 시 자식 타입까지 다 조회됩니다. 관계도에서 1번의 Bean을 조회할 경우 1,2,3,4,5,6,7까지 모두 조회가 가능합니다.
이번에는 간단한 예제를 보면서 확인해보겠습니다.

    @Configuration
    static class TestConfig {
        @Bean
        public DiscountPolicy rateDiscountPolicy() {
            return new RateDiscountPolicy();
        }

        @Bean
        public DiscountPolicy fixDiscountPolicy() {
            return new FixDiscountPolicy();
        }
    }

간단하게 테스트를 하기 위해 Bean을 생성해보았습니다. DIscountPolicy의 자식으로 rateDiscountPolicy()와 fixDiscountPolicy()를 가지고 있습니다.

여기서 주의해야할 점은 부모 타입으로 조회할 경우 자식이 둘 이상 가지고 있으면 중복 오류가 발생합니다.

public class ApplicationContextExtendsFindTest {
    AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class);

    @Test
    @DisplayName("부모 타입으로 조회시, 자식이 둘 이상 있으면, 중복 오류가 발생한다")
    void findBeanByParentTypeDuplicate() {
        DiscountPolicy bean = ac.getBean(DiscountPolicy.class); //1
        //assertThrows(NoUniqueBeanDefinitionException.class,
        //       () ->ac.getBean(DiscountPolicy.class) );
    	}
    }

위에 코드로 작성 시 NoUniqueBeanDefinitionException이 발생됩니다.

이것을 방지하기위해 assertThrows에 NoUniqueBeanDefinitionException 오류가 생긴다고 인지 시켜주어야 합니다.

1번 주석을 지우고 테스트 결과 중복 Exception을 잘 넘겨주는 것을 확인할 수 있었습니다.

반응형

댓글