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

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

부자가될거야님의 프로필 이미지
부자가될거야

작성한 질문수

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

@Mock, @Spy, @InjectMocks

Mock Test에 관련한 질문

해결된 질문

작성

·

584

0

  • 학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!

  • 먼저 유사한 질문이 있었는지 검색해 보세요.

  • 서로 예의를 지키며 존중하는 문화를 만들어가요.

     

[공지] 제가 9/27 ~ 10/9 약 2주간 해외 여행을 가게 되어, 해당 기간 동안은 질문에 대한 답변이 불가합니다. 🥲
질문을 남겨주시면 10/10 이후로 순차적으로 확인하고 빠르게 답변드릴 수 있도록 하겠습니다.
너른 양해 부탁드리며, 강의를 수강해주시는 분들 모두 항상 감사드리고, 또 응원합니다. 🙌🏻

 

안녕하세요 우빈님!
강의 수강 중 궁금한 점이 생겨서 질문드립니다!

지금까지 작성한 테스트들은 Production Code가 제대로 동작하기 위해서 ~~했을때 이러한 결과가 나와야한다! 식의 검증을 제대로 한다는 느낌을 받았습니다. 그래서 후에 코드를 수정하고 테스트를 다시 돌려보며 로직이 제대로 실행하는지를 검증하며 테스트의 이점을 잘 활용할 수 있겠다라고 생각하였습니다.

 

하지만 Mock에 대해 학습을 하면서는 이 테스트가 효과적인 테스트인가? 하는 의문이 조금씩 들기 시작하였습니다.

물론 지난 시간 학습하였던 OrderStatisticsService 의 경우 테스트의 주된 목적은 총 금액 확인이었으므로 sendEmail 메서드의 Stubbing은 왜 하는지 이해하였습니다.

 

이번 강의를 들으면서 몇가지 의문점이 생겼는데 다음과 같습니다!

  • sendEmail을 Stubbing하면 당연히 반환되는 값은 Ture 일 것

  • Mock객체의 defaultAnswer에 의해서 mailSendHistoryRepository.save()의 반환값이 null이어도 테스트가 성공함

  • 로직을 원하는대로 수행하기 위해 메서드가 몇번 호출되는지 검증을 할 필요가 있는가?

     

     

    전체적으로 Stubbing을 얼마나 잘하는지에 대한 테스트를 한다는 느낌을 받았습니다!

혹시 기능에 대한 사용법을 알려주시려고 한것인지 아니면 실무에서도 이러한 테스트를 작성하는지, 작성한다면 verify()를 사용할때 메서드 호출횟수를 검증하여 얻고자 하는것은 무엇인지, 그리고 모든 메서드를 Sutbbing하게 되면 해당 코드에서 무엇을 검증하는것인지 궁금합니다!

 

감사합니다!

 

답변 2

1

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

안녕하세요, 부자가될거야 님! :)

충분히 고민이 되실 수 있는 지점이네요. ㅎㅎ

기본적으로, 현재 예시로 사용했던 프로젝트의 요구사항이나 가정한 상황이 복잡하지는 않아서 더 그래보일 수는 있을 것 같은데요.

당연해보이는 테스트임에도 테스트 코드를 작성하는 이유 중 하나는, 미래에 해당 부분에 대한 요구사항이 어떻게 바뀔지, 혹은 로직이 어떻게 리팩토링될지 모르기 때문입니다.
그런 상황이 왔을 때, 테스트 코드가 있기 때문에 안전하게, 그리고 유연하게 대처할 수 있습니다.

그리고 테스트에서 mocking을 하는 이유는, 테스트하기 어려운 해당 로직을 제외한 나머지 로직을 테스트하기 위함입니다.
해당 테스트의 경우에는 MailSendHistory를 저장하는 로직을 테스트하기 위해서 일텐데, 이 때 verify()를 사용한 것은 이렇게도 가능하다는 것을 보여드리기 위함이 맞습니다. ㅎㅎ

'메일 전송 코드가 무조건 true인데 MailSendHistory가 호출되는지를 보는 것이 맞는가?' 라는 관점보다는, 외부 시스템을 호출하는 등 mocking이 필요한 상황이 오면 적절하게 잘 사용하자, 라는 취지로 이해해주시면 좋을 것 같아요. ㅎㅎ

도움이 되셨기를 바랍니다.
감사합니다. :)

0

안녕하세요, 인프런 AI 인턴이에요. Mock에 대한 테스트가 효과적인 테스트인지에 대해 의문이 들었다고 하셨는데요.

Mock이란 특정한 객체를 대신하여 테스트를 수행하는 방법입니다. 예를 들어, 특정 메소드를 호출할 때 실제로는 외부 리소스나 다른 객체와의 상호작용이 필요한 경우, 해당 리소스나 객체를 Mock 객체로 대체하여 테스트를 진행할 수 있습니다.

Mock 테스트는 실제 환경을 재현하지 않고도 테스트를 수행할 수 있어서 빠르고 견고한 테스트를 만들 수 있습니다. 하지만 Mock 테스트의 효과적인 사용은 테스트 대상 코드가 외부 의존성이 많을 때나 특정 환경에서 테스트가 어려운 경우에 유용합니다.

그러나 Mock 테스트의 적절한 사용은 상황에 따라 다를 수 있습니다. 테스트 대상 코드가 외부 의존성이 적고 다른 테스트 기법으로 충분히 검증할 수 있는 경우에는 Mock 테스트를 적용하지 않아도 됩니다. 또한, Mock 테스트는 테스트 대상 코드가 많은 변동이 있을 때 유지보수성이 저하될 수 있으므로, 그런 상황에서는 다른 테스트 기법을 고려해보는 것도 좋습니다.

따라서 Mock 테스트를 사용하는 것이 효과적인지 여부는 테스트 대상 코드의 특성과 환경에 따라 다르므로, 실제 상황에서는 적절한 판단과 고민이 필요합니다.

추가적으로, Mock 테스트에 대해 더 알고 싶으시다면 관련된 강의나 문서를 참고하는 것을 추천드립니다. 많은 도움이 되시길 바랄게요. 어떤 부분을 고민하시는지 자세히 알려주시면 더 구체적인 도움을 드릴 수 있을 것 같아요. 좋은 공부 되세요!

부자가될거야님의 프로필 이미지
부자가될거야

작성한 질문수

질문하기