inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

@Mock, @Spy, @InjectMocks

Mock Test에 관련한 질문

해결된 질문

692

부자가될거야

작성한 질문수 11

0

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

 

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

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

 

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

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

 

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

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

 

감사합니다!

 

spring tdd jpa mockito 소프트웨어-테스트 junit5

답변 2

1

박우빈

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

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

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

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

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

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

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

0

인프런 AI 인턴

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

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

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

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

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

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

private 상수 테스트 관련 질문

0

83

1

void는 어떻게 테스트하나요..? void로 애초에 코딩하면 안되나요??

0

126

2

커버리지는 어떻게 활용하시는지 궁금합니다.

0

161

2

테스트 문서화 질문입니다

0

105

2

단위테스트 질문이 있습니다

0

96

2

컨트롤러는 모킹을 한 이유가 궁금합니다.

0

103

2

ERD 가장자리에 있는 도메인 테스트 질문

0

89

2

DTO 검증 필드에 대한 테스트 코드 작성은 어디까지?

0

135

2

OrderCreateRequest DTO에 대해서 궁금한점

0

102

2

고전파의 테스트 대역 사용 대상, 공유 의존성

0

156

2

계층 관련 질문이 있습니다.

0

139

3

'코틀린'에서는 빌더를 따로 쓰지 않는데, 이 때는 어떻게 test fixture를 만드시는지 궁금합니다

1

124

2

혹시 update 로직은 어떻게 테스트하나요? (@Setter?)

0

134

2

단위테스트와 통합테스트의 경계가 궁금합니다.

0

228

2

Service+Repository 통합테스트 관련 질문입니다.

0

150

2

OrderControllerDocsTest 작성 해봤는데요. 날짜 형식이 이상하게 나와요

0

185

2

test 용 .yml

0

90

2

throws Exception

0

80

2

카페키오스크 클래스 문의 ,,

0

89

2

Rest docs 문서용 테스트코드를 따로 작성해야 되나요?

0

174

2

테스트 코드에서 필요한 생성자

0

138

1

tearDown 순서

0

116

2

@Builder 생성자 private

0

136

2

@DisplayName gradle / intellJ

0

93

2