@TestConfiguration 관련 설명과 실제 동작이 다른 부분이 있는 것 같습니다.
166
작성한 질문수 4
안녕하세요 토비님! 좋은 강의 정말 감사드립니다.
@TestConfiguration 에 대한 설명을 해주신 부분 중에서 테스트 결과와 다른 부분이 있는 것 같아 확인차 질문 드립니다.
<28. 회원 애플리케이션 서비스 테스트 (2)> 의 11:38에서 "@TestConfiguration 에 어떤 Bean을 정의하면 이게 우선이 되어 돌아갑니다." 라는 말씀을 해주셨는데요.
해당 말씀이 맞는지 테스트해 보기 위해, 현재의 강의 예제 코드에서 @TestConfiguration 이 붙은 클래스의 PasswordEncoder를 정의한 Bean 메서드의 이름을 testPasswordEncoder로 변경하고 테스트를 돌려 보니 아래와 같은 오류가 발생하였습니다.

(EmailSender의 경우 DummyEmailSender에 @FallBack 이 붙어 있어서 @TestConfiguration 의 EmailSender Bean 메서드의 이름을 다르게 구성하더라도 테스트는 정상적으로 동작합니다.)
@TestConfiguration 이 정의되었다고 해서 우선순위로 동작하지는 않는 것으로 보이고,
기존 Bean의 적용 우선순위에 따라 @TestConfiguration 에서 정의한 메서드 이름과, 이를 사용하는 곳의 필드 이름이 동일한 경우 해당 Bean을 찾아서 동작하는 것으로 보였습니다.
혹시 제가 잘못 이해하고 있거나 보완이 필요한 부분이 있다면 편히 말씀 부탁드립니다.
확인 부탁드립니다.
감사합니다 :)
답변 1
2
앗. 제가 저렇게 설명을 했군요. ㅠㅠ
지적해주신 대로 이건 제가 잘못 설명을 한 것이 맞습니다.
테스트에서 메인 모듈의 빈을 재 구성해서 사용하기 위해서는 @TestConfiguration을 이용하기도 하는데 이때 @TestConfiguration에 정의된 빈이 항상 우선적으로 선택되어서 단일 의존관계 조건을 만족시키지는 않습니다. 실전에서 설명하면서 코딩을 할 때처럼 코드를 만들어 보면서 테스트가 잘 성공하는 방법을 찾아가는 과정과 설명을 함께 하려다가 테스트가 잘 동작하는 것을 보고 스프링 동작 방식에 대해서 순간 착각을 했었네요.
@TestConfiguration에서 재정의한 빈이 사용되도록 하려면 @Primary를 붙여서 우선적으로 선택되도록 해야 합니다. 혹은 네이밍룰이 확실하다면 이번 예제에서처럼 주입 받을 프로퍼티와 정확히 일치하는 이름을 사용하거나 요즘은 별로 권장하지 않지만 allow-bean-definition-overriding을 이용하는 방법도 있습니다.
특정 테스트에서 구현을 의도적으로 다르게 가져가거나 테스트에서 쓰이는 빈이 다르게 정의했다는 것을 명시하려면 @TestConfiguration을 테스트 클래스 내부로 가져가는 방법, 또는 최근에 스프링에 추가된 @TestBean을 쓰는 게 권장됩니다. 구현 자체를 다시 만들 게 아니라면 @MockitoBean 같은 걸 쓰거나요.
중요한 설명을 잘못했는데 이걸 체크해주셔서 감사합니다. 이걸 수강생 분들에게 어떻게 정정해 드릴지 고민을 해보겠습니다.
도메인 모델에서 관계와 규칙을 구분하는 방법
0
37
2
헥사고날 아키텍처에서의 배치, 시큐리티, 비동기 이벤트 처리는 어떻게 하나요?
0
115
2
어댑터에서 도메인에 직접 의존하는 경우에 대해
0
116
2
Member 도메인이 PasswordEncoder를 받는 구조 질문 있습니다.
0
103
2
MemberService와 EmailSender 책임 분리에 대한 질문
0
102
2
NonNullApi를 NullMarked로 대체하라고 합니다.
0
123
2
39. 문서와 코드 다듬기 updateInfo 테스트 질문 있습니다.
0
71
2
Repository Adapter 설계에 대해 피드백을 부탁드립니다
0
105
2
헥사고날 part2 강의 출시 예정일 문의 드립니다.
0
244
2
PT 문의사항
0
97
1
초기 어플리케이션 구동 시 compose.yml 파싱 오류
0
147
2
애플리케이션의 JPA 리턴과 도메인 모델
0
125
2
애그리거트 루트의 하위 도메인들의 depth가 깊어질 때 문의
0
133
2
페이징 처리를 해야한다면 어떻게 해야할까요?
0
187
2
애그리거트의 repository
0
116
2
Domain Expert가 정확히 어떤 역할을 하는 사람인가요?
0
228
1
회원 애플리케이션 서비스 테스트 (1)
0
102
2
정적 팩토리 메서드 관련 질문드립니다!
0
103
2
spotbug + @NonNullApi 로만 Null 방어가 될까요?
0
127
2
required 포트에 관해서
0
90
2
혹시 다음 편은 언제쯤 오픈할까요?
0
163
2
서비스 단위 테스트 코드 작성
0
94
2
domain 모듈에 entity를 정의한다고 했을때
0
95
2
여러 엔티티의 조합으로 리포트를 제공해야할 때
0
78
2





