void는 어떻게 테스트하나요..? void로 애초에 코딩하면 안되나요??
123
작성한 질문수 7
강의를 수강한 이후 테스트 코드를 짜다가 문득 궁금하여 문의드립니다.
보통 테스트 코드는 입력이 있고, 그것에 대한 출력을 검증하는 것인데 반환 값이 void면 어떻게 테스트 코드를 짜면 되는지 궁금합니다. (예를들어 단순 update문)
copilot이나 ai는 verify로 행위 검증을 하던데... 이렇게 하는게 맞는건지, 아니면 void로 반환하는것 자체를 지양하는게 좋은지... 의견을 여쭙고 싶습니다!!!
답변 2
1
안녕하세요, 한지찬 님!
몇 가지 명제들을 제시하며 답변 드리겠습니다.
테스트를 위해서 void 메서드를 억지로 반환값이 있는 형태로 바꾼다. (X)
메서드의 의미상 반환 값이 존재하는 형태가 더 자연스럽다면 void 보다는 반환 값이 있는 형태가 여러모로 좋다. (O)
이 때 검증은 반환되는 값이 예상한 값과 일치하는지 확인하는 방법을 사용할 수 있다.
메서드의 의미상 void가 더 자연스럽다면 void로 만드는 것이 좋다. (O)
이 때 검증은 verfiy 등을 활용할 수 있다.
테스트 코드와 프로덕션 코드는 공존하는 관계여야 하며, 테스트의 용이함을 위해 프로덕션 코드를 그에 유리한 쪽으로 변경할 수는 있지만, 해당 행위가 본래의 그 의미를 해칠 정도로 과해서는 안 됩니다. verify를 사용하는 것이 잘못된 방법도 아니고요. 여러 존재하는 검증 방법 중 적절한 방법을 찾아 선택하는 것이 중요하겠습니다.
도움이 되셨기를 바랍니다.
감사합니다. 🙂
0
안녕하세요, 인프런 AI 인턴입니다. 한지찬님!
테스트 코드를 작성할 때 void 메서드는 반환값이 없어 직접 검증이 어려울 수 있습니다. void 메서드를 테스트하기 위한 일반적인 방법은 행위 검증을 통해 간접적으로 확인하는 것입니다. Mockito에서는 verify 메서드를 사용하여 특정 메서드가 호출되었는지 여부를 확인할 수 있습니다. 예를 들어, update 메서드가 제대로 실행되었는지 확인하기 위해 해당 메서드가 호출되었다는 사실을 증명할 수 있습니다.
행위 검증의 예시:
- 특정 레포지토리의 save 메서드가 호출되었음을 검증하는 코드:
verify(myRepository, times(1)).save(any());
그러나 가능한 경우, 명확한 반환값을 제공하여 테스트가 수월하도록 설계하는 것이 권장됩니다. 반환값을 통해 메서드의 결과를 직접 검증할 수 있기 때문입니다. 그러나 모든 경우에 반환값을 제공할 수 없는 상황이라면, 행위 검증을 통해 충분히 테스트할 수 있습니다.
관련된 다른 질문들에서도 void 메서드의 테스트와 관련된 유용한 논의를 볼 수 있습니다. 아래 URL에서 이야기한 내용을 참고하시면 도움이 될 것 같습니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
private 상수 테스트 관련 질문
0
81
1
커버리지는 어떻게 활용하시는지 궁금합니다.
0
158
2
테스트 문서화 질문입니다
0
104
2
단위테스트 질문이 있습니다
0
93
2
컨트롤러는 모킹을 한 이유가 궁금합니다.
0
100
2
ERD 가장자리에 있는 도메인 테스트 질문
0
86
2
DTO 검증 필드에 대한 테스트 코드 작성은 어디까지?
0
131
2
OrderCreateRequest DTO에 대해서 궁금한점
0
101
2
고전파의 테스트 대역 사용 대상, 공유 의존성
0
153
2
계층 관련 질문이 있습니다.
0
137
3
'코틀린'에서는 빌더를 따로 쓰지 않는데, 이 때는 어떻게 test fixture를 만드시는지 궁금합니다
1
121
2
혹시 update 로직은 어떻게 테스트하나요? (@Setter?)
0
133
2
단위테스트와 통합테스트의 경계가 궁금합니다.
0
224
2
Service+Repository 통합테스트 관련 질문입니다.
0
149
2
OrderControllerDocsTest 작성 해봤는데요. 날짜 형식이 이상하게 나와요
0
183
2
test 용 .yml
0
89
2
throws Exception
0
78
2
카페키오스크 클래스 문의 ,,
0
87
2
Rest docs 문서용 테스트코드를 따로 작성해야 되나요?
0
171
2
테스트 코드에서 필요한 생성자
0
135
1
tearDown 순서
0
113
2
@Builder 생성자 private
0
132
2
@DisplayName gradle / intellJ
0
90
2
36:40 초 부근에 tearDown 없어도 통과하는 이유가 궁금해요
0
178
2





