반응형
컨트롤러 계층의 테스트를 만들면서, 내가 생각한대로 테스트가 작동하지 않았다. 이게 분명히 테스트가 통과되어야 할 것 같이 구현했는데, 자꾸 통과하지 못하는 것이다. 뭐가 문제인지 콘솔을 살펴보니 Response Body가 통째로 비어있었다.
이게 뭔 일인가 싶어 Postman을 켜서 같은 동작을 수행해보았다.
이러면 기능 구현에는 문제가 없어보였다. 테스트 코드에 뭐가 문제인지를 알아야했다. 이럴 때는 2023년에 살고있는게 참 좋다. 구글은 검색하면 다 알려준다. 관련해서 참고한 두 글의 링크를 남겨놓는다.
[Spring/Test] WebMvcTest에서 Response Body가 Empty일 때
WebMvcTest를 진행하는데, MockHttpServletResponse의 Body가 비어있다.
velog.io
핵심은 mocking에 있었다. 내가 사용하던 mock 코드는 다음과 같다.
given(freeBoardService.postFreeBoard(testPost)).willReturn(testResponse);
문제는 Mockito에서 given()절을 수행할 때, equals를 통해 객체를 비교하고 return 해주는 점에 있었다. 나는 DTO에 equals를 구현하지 않았다. 그럼 이제 해결 방법은 두 가지가 있었다.
- equals()와 hashCode()를 적절히 구현한다.
- any()를 사용한다.
나는 2번의 방법을 사용했다. 이유는 다음과 같다.
- 어짜피 내가 테스트하고 싶은건 뭔가 Post DTO를 넣었을 때, 입력한 값과 같은 값들을 가진 Response DTO가 생성되는지가 아니다. 이건 Service를 테스트할 때 이미 작성했다.
- 그렇다면, 일단 Response DTO가 반환되게만 만들어 놓고, 최종적으로 Controller의 메서드가 반환하는 값이 Post DTO의 값과 같은지만 확인하면 된다.
DTO 따위에 시간 들여서 equals()와 hashCode()를 구현할 필요는 없다. 귀찮다.
문제는 잘 해결됐으며, 이번 기회로 객체 인스턴스를 사용해서 Mockito의 동작을 적절히 수행하기 위해서는 equals() 가 필요함을 알게 되었다.
반응형
'Programming > 삽질일지' 카테고리의 다른 글
[12/26 TIS] 혹시 이 글을 보고 계신다면 제발 도와주세요. (1) | 2023.12.27 |
---|---|
[12/6 TIS] @AuthenticationPrincipal 사용기 - null 해결법 (2) | 2023.12.06 |
[11/20 TIS] git push가 먹통이 된 날 (2) | 2023.11.20 |
[8/29 TIS] 나의 리팩토링일지 - 객체가 알아야 할 것은 무엇인가? (0) | 2023.08.29 |
[8/25 TIS] N+1 문제 찾아나서기 (0) | 2023.08.25 |
댓글