개발자

Junit Mockito 단위테스트에서 @ConfigurationProperties 관련 질문 드립니다.

2023년 04월 23일조회 159

@ConfiturationPRoperties를 통해 외부변수 값을 가져오고, 해당 외부변수 값을 필드로 사용하는 클래스를 스프링 빈을 등록해둔 상태입니다. 테스트가 아닌 실제 어플리케이션 구동 시에는 외부변수 값이 스프링 빈에 제대로 적용되는 것을 확인했습니다. 그런데 @Spy를 통해 주입한 객체에는 외부변수 값이 적용되지 않아 null인 상태입니다. 이런 현상이 왜 발생하는지 궁금합니다. 그리고 해결 방법이 있는지 궁금합니다. 답변 부탁드립니다. 캡처 사진들은 관련된 코드들입니다.

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.

답변 1

커리어리 AI 봇님의 프로필 사진

안녕하세요! @ConfigurationProperties를 사용하여 외부변수 값을 가져와 필드로 사용하는 클래스를 스프링 빈으로 등록하셨는데, @Spy를 사용하여 주입한 객체에서는 외부변수 값이 적용되지 않는 현상이 발생하는 것 같습니다. 이는 @Spy를 사용할 때 객체를 생성하는 방식 때문에 발생하는 문제입니다. @Spy는 실제 객체를 생성하는 것이 아니라 기존 객체를 spy(간접적으로 관찰)하여 테스트를 수행합니다. 이 때, 외부변수 값을 가져오는 @ConfigurationProperties는 기존 객체 생성 시점에 호출되므로, @Spy를 통해 객체를 생성하면 외부변수 값이 적용되지 않는 문제가 발생합니다. 해결 방법으로는 @MockBean을 사용하여 스프링 빈을 생성하고, 이를 주입하는 것이 있습니다. @MockBean은 스프링 빈을 가짜 객체로 대체하여 테스트를 수행합니다. 따라서 외부변수 값을 가져오는 @ConfigurationProperties도 스프링 빈으로 생성되어 외부변수 값을 정상적으로 가져올 수 있습니다. 아래는 예시 코드입니다. 이렇게 @MockBean을 사용하여 스프링 빈을 생성하면, 외부변수 값을 가져오는 @ConfigurationProperties도 스프링 빈으로 생성되어 정상적으로 값을 가져올 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@SpringBootTest
@RunWith(SpringRunner.class)
public class MyTest {
  
  @MockBean
  private MyConfigurationProperties myConfigurationProperties;
  
  @Autowired
  private MyClass myClass;

  @Test
  public void test() {
    // ...
  }
}

커리어리 AI 봇의 답변을 평가해 주세요!

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

목록으로
키워드로 질문 모아보기

실무, 커리어 고민이 있다면

새로운 질문 올리기

지금 가입하면 모든 질문의 답변을 볼 수 있어요!