해결된 질문
작성
·
70
0
안녕하세요
https://inf.run/QwLTR
위의 링크와 연계되는 질문입니다.
복습을 하다 보니 언제 when()으로 stubbing 을 해 줘야할까에 대해 헷갈려져서, 저의 사고 흐름을 정리해봤습니다
컨트롤러에서는 서비스 단 하위로는 모킹을 한다.
모킹하는 객체들은 테스트에서 주 관심사가 아니며, 항상 잘 동작한다고 가정한다.
모킹해오는 객체들은 stubbing을 해주지 않는다면 기본 값들을 반환하는 정책을 따른다.
위 질문 링크의 "판매 상품을 조회한다." 테스트에서는 모킹 객체인 productService의 메소드가 어떤 리턴값을 반환하든 presentation 레이어에서 검증하고 싶은 내용이 아니기 때문에, 검증을 수행하지 않았고, productService.getSellingProducts()에 대한 stubbing도 굳이 필요 없다.
"메일 전송 테스트" 에서 mailSendClient.sendEmail()에 대한 stubbing이 필요한 이유
모킹 객체인 mailSendClient.sendMail()이 기본 값 반환 정책이 false이어서, 테스트 하고자 하는 mailService.sendMail()에 영향을 미치기 때문이다. (여기서 기본 값 반환 정책이 true였다면 굳이 stubbing 해주지 않아도 된다 -> "메일 전송 테스트"에서 검증하고자 하는 대상이 아니기 때문에)
이런식으로 테스트에 검증하고자 하는 대상에 집중하다 보면 모든 동작을 제대로 stubbing했다고 보장하기 어려워 진다 -> Mockist의 치명적인 단점
제가 정리해 본 내용이 적절한지 알려주시면 감사합니다.
테스트의 세계는 정말 헷갈리네요..
답변 2
1
안녕하세요, 김상형 님!
너무 잘 정리해 주신 것 같아요. 핵심은 말씀해주신 것처럼 테스트하려는 대상에만 집중하고, 내가 제어할 수 없는 외부 세계의 영역을 stubbing(mocking) 한다, 라고 이해해주시면 됩니다.
감사합니다. 🙂
0
안녕하세요, 인프런 AI 인턴입니다.
김상형님, 테스트 작성에 대해 고민하시는 부분을 잘 정리해주셨습니다. 각 포인트에 대해 적절한지 검토해드리겠습니다.
컨트롤러에서 모킹
모킹한 객체의 기본 반환 정책
메일 전송 테스트에서의 Stubbing 필요성
mailSendClient.sendMail()
의 경우, 메일 전송 여부에 따른 로직이 존재한다면, 이 부분을 stubbing하여 테스트 환경에서 제어할 필요가 있습니다.Mockist의 단점
테스트 세계에서의 이러한 고민은 자연스러운 과정입니다. 계속해서 실험하고 학습하면서 코드를 개선해 나가시는 것이 중요합니다. 해당 답변이 김상형님의 이해에 도움이 되었기를 바랍니다. 더 궁금한 점이 있으면 언제든지 질문해 주세요!
추가적으로, Spring Boot에서의 테스팅 관련 공식 문서도 확인해보시는 것을 추천드립니다:
테스트를 잘 익히시면, 코드의 안정성과 품질을 크게 향상시킬 수 있습니다. 화이팅입니다!