강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

호준님의 프로필 이미지
호준

작성한 질문수

토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1

@TestConfiguration 관련 설명과 실제 동작이 다른 부분이 있는 것 같습니다.

작성

·

102

·

수정됨

1

안녕하세요 토비님! 좋은 강의 정말 감사드립니다.

@TestConfiguration 에 대한 설명을 해주신 부분 중에서 테스트 결과와 다른 부분이 있는 것 같아 확인차 질문 드립니다.

 

<28. 회원 애플리케이션 서비스 테스트 (2)> 의 11:38에서 "@TestConfiguration 에 어떤 Bean을 정의하면 이게 우선이 되어 돌아갑니다." 라는 말씀을 해주셨는데요.

해당 말씀이 맞는지 테스트해 보기 위해, 현재의 강의 예제 코드에서 @TestConfiguration 이 붙은 클래스의 PasswordEncoder를 정의한 Bean 메서드의 이름을 testPasswordEncoder로 변경하고 테스트를 돌려 보니 아래와 같은 오류가 발생하였습니다.

image.png

(EmailSender의 경우 DummyEmailSender에 @FallBack 이 붙어 있어서 @TestConfigurationEmailSender Bean 메서드의 이름을 다르게 구성하더라도 테스트는 정상적으로 동작합니다.)

 

@TestConfiguration 이 정의되었다고 해서 우선순위로 동작하지는 않는 것으로 보이고,
기존 Bean의 적용 우선순위에 따라 @TestConfiguration 에서 정의한 메서드 이름과, 이를 사용하는 곳의 필드 이름이 동일한 경우 해당 Bean을 찾아서 동작하는 것으로 보였습니다.

 

혹시 제가 잘못 이해하고 있거나 보완이 필요한 부분이 있다면 편히 말씀 부탁드립니다.

 

확인 부탁드립니다.
감사합니다 :)

답변 1

1

토비님의 프로필 이미지
토비
지식공유자

앗. 제가 저렇게 설명을 했군요. ㅠㅠ

지적해주신 대로 이건 제가 잘못 설명을 한 것이 맞습니다.

테스트에서 메인 모듈의 빈을 재 구성해서 사용하기 위해서는 @TestConfiguration을 이용하기도 하는데 이때 @TestConfiguration에 정의된 빈이 항상 우선적으로 선택되어서 단일 의존관계 조건을 만족시키지는 않습니다. 실전에서 설명하면서 코딩을 할 때처럼 코드를 만들어 보면서 테스트가 잘 성공하는 방법을 찾아가는 과정과 설명을 함께 하려다가 테스트가 잘 동작하는 것을 보고 스프링 동작 방식에 대해서 순간 착각을 했었네요.

@TestConfiguration에서 재정의한 빈이 사용되도록 하려면 @Primary를 붙여서 우선적으로 선택되도록 해야 합니다. 혹은 네이밍룰이 확실하다면 이번 예제에서처럼 주입 받을 프로퍼티와 정확히 일치하는 이름을 사용하거나 요즘은 별로 권장하지 않지만 allow-bean-definition-overriding을 이용하는 방법도 있습니다.

특정 테스트에서 구현을 의도적으로 다르게 가져가거나 테스트에서 쓰이는 빈이 다르게 정의했다는 것을 명시하려면 @TestConfiguration을 테스트 클래스 내부로 가져가는 방법, 또는 최근에 스프링에 추가된 @TestBean을 쓰는 게 권장됩니다. 구현 자체를 다시 만들 게 아니라면 @MockitoBean 같은 걸 쓰거나요.

중요한 설명을 잘못했는데 이걸 체크해주셔서 감사합니다. 이걸 수강생 분들에게 어떻게 정정해 드릴지 고민을 해보겠습니다.

호준님의 프로필 이미지
호준
질문자

상세한 답변과 확인 감사드립니다! :)

호준님의 프로필 이미지
호준

작성한 질문수

질문하기