개발자
@ConfiturationPRoperties를 통해 외부변수 값을 가져오고, 해당 외부변수 값을 필드로 사용하는 클래스를 스프링 빈을 등록해둔 상태입니다. 테스트가 아닌 실제 어플리케이션 구동 시에는 외부변수 값이 스프링 빈에 제대로 적용되는 것을 확인했습니다. 그런데 @Spy를 통해 주입한 객체에는 외부변수 값이 적용되지 않아 null인 상태입니다. 이런 현상이 왜 발생하는지 궁금합니다. 그리고 해결 방법이 있는지 궁금합니다. 답변 부탁드립니다. 캡처 사진들은 관련된 코드들입니다.
답변 1
안녕하세요! @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 봇의 답변을 평가해 주세요!
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
지금 가입하면 모든 질문의 답변을 볼 수 있어요!