Closed utterances-bot closed 1 year ago
안녕하세요. 글 잘 읽었습니다. 궁금한 점이 있어서 댓글 남깁니다.
테스트 코드의 RequestDto requestDto = new RequestDto();
대신 필드가 비어있지 않은 Dto를 가지도록 given 시나리오를 구성하고 테스트를 하면 될 것 같다는 생각이 드는데,
Spy를 사용하는 것과 무슨 차이가 있는 건가요?
감사합니다.
안녕하세요. 해당 글에 대한 답글이 없어 얕은 지식이지만 답변을 조금 해보자면
RequestDto requestDto = new RequestDto();
와 관계없이 @InjectMocks
만을 사용했을 때 같은 Service 내의 다른 메서드는 Mocking이 되지 않습니다.(@spy 외의 다른 방법이 있을까요?? ) 또한 @Spy
를 사용할 경우 위의 테스트 코드는 doNothing().when()
을 사용했지만 만약! 다른 결과를 원한다면 doReturn().when()
을 사용해서 테스트 할 수 있습니다.doReturn().when() . 또 @Spy
와 @InjectMocks
을 함께 사용해도 되는지에 대한 article도 한번 읽어보면 재미있을 듯 합니다. spy and injectMocks
해당 글에 잘못된 부분이 있다면 바로 수정하도록 하겠습니다~!
KrGil님, 답변 감사합니다. 덕분에 원문과 질문을 다시 찬찬히 확인해보고, 질문이 명확하지 않았다는걸 알게 되었네요.
말씀하신대로, Spy를 사용하지 않는다면 alarm() 메서드를 스터빙할 수 없을 것입니다. 다만, '테스트 클래스에서는 RestTemplate이 이미 모킹되어있는데, 굳이 alarm()을 스터빙해야 하는가?' 라는 의문이 들었습니다.
제가 생각했던 Spy가 아닌 다른 방법은, CustomerService.alarm()
내부의 RestTemplate call 을 스터빙 하는 것인데요. 아래처럼요.
@Test(...)
public void 결제가 실패하면...() {
// given
RequestDto requestDto = new RequestDto("Name", "ServiceNo"); // validation 통과를 위해 값을 채워넣기
doNothing().when(restTemplate).postForEntity(CustomerService.ALARM_URL, requestDto, String.class); // 스텁을 위해 추가된 라인
given(restTemplate.postForEntity(CustomerService.PAY_URL, requestDto, String.class))
.willReturn(new RestClientException("결제실패"));
// when
customerService.pay(requestDto);
// then
verify(...)
}
굳이 Spy로 alarm()을 스터빙해야 하는 이유가 무엇인지 대한 혼란이 있었습니다. 다만, 예제 코드는 Spy를 쉽게 이해시킬 목적에서 쓰여진 아주 간단한 코드라는 생각이 듭니다. 현실 세계의 코드에서는 alarm() 내부에서 여러 번의 외부 API 호출을 한다던가, 다양한 의존성 객체의 메서드를 호출하는 등 복잡하게 구성될 수도 있습니다. 이때는 이 모든 내부 동작에 대한 스텁이 필요할 것이구요.
따라서, 테스트 관심사 이외의 영역을 테스트 코드가 구체적으로 알고 있는 것보단, Spy를 쓰는 게 맞겠다는 결론을 내리게 되었습니다.
부족한 부분이 있다면 지적 부탁드리며, 알기 쉽게 설명해주셔서 감사드립니다 😊
아~ 제가 질문의 의도를 잘못 알아들었군요! 저도 역시 shoukou-lee님의 답글을 보고 다시 한번 원문을 살펴 보았는데요~ 위의 말씀하신 것처럼
굳이 Spy로 alarm()을 스터빙해야 하는 이유가 무엇인지 대한 혼란이 있었습니다. 다만, 예제 코드는 Spy를 쉽게 이해시킬 목적에서 쓰여진 아주 간단한 코드라는 생각이 듭니다. 현실 세계의 코드에서는 alarm() 내부에서 여러 번의 외부 API 호출을 한다던가, 다양한 의존성 객체의 메서드를 호출하는 등 복잡하게 구성될 수도 있습니다. 이때는 이 모든 내부 동작에 대한 스텁이 필요할 것이구요.
해당 사항으로 인해 @Spy
를 사용하지 않았나 싶습니다! 덕분에 깊게 생각하지 못하고 지나쳤던 부분을 다시 살펴 볼 수 있게 되었습니다! 오늘도 많이 배워 가는군요ㅎㅎ 감사합니다!!👍👍
Spy 사례1 - 테스트 대상 Mocking 하기
안녕하세요? Spy의 활용 사례 1번째를 소개드립니다. 모든 코드는 Github에 있기 때문에 함께 보시면 더 이해하기 쉬우실 것 같습니다. (공부한 내용을 정리하는 Github와 세미나+책 후기를 정리하는 Github, 이..
https://jojoldu.tistory.com/239