인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

김상형님의 프로필 이미지

작성한 질문수

Practical Testing: 실용적인 테스트 가이드

@Mock, @Spy, @InjectMocks

stubbing을 해줘야 하는 이유

해결된 질문

작성

·

70

0

안녕하세요

https://inf.run/QwLTR

위의 링크와 연계되는 질문입니다.
복습을 하다 보니 언제 when()으로 stubbing 을 해 줘야할까에 대해 헷갈려져서, 저의 사고 흐름을 정리해봤습니다

  1. 컨트롤러에서는 서비스 단 하위로는 모킹을 한다.
    모킹하는 객체들은 테스트에서 주 관심사가 아니며, 항상 잘 동작한다고 가정한다.

  2. 모킹해오는 객체들은 stubbing을 해주지 않는다면 기본 값들을 반환하는 정책을 따른다.
    위 질문 링크의 "판매 상품을 조회한다." 테스트에서는 모킹 객체인 productService의 메소드가 어떤 리턴값을 반환하든 presentation 레이어에서 검증하고 싶은 내용이 아니기 때문에, 검증을 수행하지 않았고, productService.getSellingProducts()에 대한 stubbing도 굳이 필요 없다.

  3. "메일 전송 테스트" 에서 mailSendClient.sendEmail()에 대한 stubbing이 필요한 이유


    모킹 객체인 mailSendClient.sendMail()이 기본 값 반환 정책이 false이어서, 테스트 하고자 하는 mailService.sendMail()에 영향을 미치기 때문이다. (여기서 기본 값 반환 정책이 true였다면 굳이 stubbing 해주지 않아도 된다 -> "메일 전송 테스트"에서 검증하고자 하는 대상이 아니기 때문에)

  4. 이런식으로 테스트에 검증하고자 하는 대상에 집중하다 보면 모든 동작을 제대로 stubbing했다고 보장하기 어려워 진다 -> Mockist의 치명적인 단점

 

제가 정리해 본 내용이 적절한지 알려주시면 감사합니다.

테스트의 세계는 정말 헷갈리네요..

답변 2

1

박우빈님의 프로필 이미지
박우빈
지식공유자

안녕하세요, 김상형 님!

너무 잘 정리해 주신 것 같아요. 핵심은 말씀해주신 것처럼 테스트하려는 대상에만 집중하고, 내가 제어할 수 없는 외부 세계의 영역을 stubbing(mocking) 한다, 라고 이해해주시면 됩니다.

감사합니다. 🙂

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다.

김상형님, 테스트 작성에 대해 고민하시는 부분을 잘 정리해주셨습니다. 각 포인트에 대해 적절한지 검토해드리겠습니다.

  1. 컨트롤러에서 모킹

    • 맞습니다. 테스트 시에는 주로 관심사인 레이어를 제외한 다른 부분들은 모킹하여 그와 관련된 복잡성을 제거하고자 합니다. 이는 외부 시스템이나 서비스에 의존하지 않고 단위 테스팅을 가능하게 합니다.
  2. 모킹한 객체의 기본 반환 정책

    • Mockito와 같은 프레임워크에서는 모의 객체가 특정한 메소드를 호출할 때, 기본적으로 null, 숫자형 기본값(0), 빈 컬렉션 등을 반환합니다. 따라서 특정한 반환 값이 필요하지 않다면 굳이 스터빙할 필요가 없습니다. 이 점에서 “판매 상품을 조회한다” 테스트에서의 스터빙 결정은 적절하게 보입니다.
  3. 메일 전송 테스트에서의 Stubbing 필요성

    • 잘 이해하셨습니다. 특정 메소드의 기본 반환 값이 테스트하려는 로직에 영향을 미친다면, 반드시 stubbing을 통해 원하는 값을 지정해주어야 합니다. mailSendClient.sendMail()의 경우, 메일 전송 여부에 따른 로직이 존재한다면, 이 부분을 stubbing하여 테스트 환경에서 제어할 필요가 있습니다.
  4. Mockist의 단점

    • Mockist 스타일로 모든 것을 모킹할 경우, 각종 상호작용에 대한 설정이 필요합니다. 이는 원치 않는 복잡성을 초래할 수도 있으며, 테스트의 유지보수를 어렵게 할 수 있는 단점이 있습니다. 이 부분에 대한 이해도 잘 하신 것 같습니다.

테스트 세계에서의 이러한 고민은 자연스러운 과정입니다. 계속해서 실험하고 학습하면서 코드를 개선해 나가시는 것이 중요합니다. 해당 답변이 김상형님의 이해에 도움이 되었기를 바랍니다. 더 궁금한 점이 있으면 언제든지 질문해 주세요!

추가적으로, Spring Boot에서의 테스팅 관련 공식 문서도 확인해보시는 것을 추천드립니다:

테스트를 잘 익히시면, 코드의 안정성과 품질을 크게 향상시킬 수 있습니다. 화이팅입니다!