본문 바로가기
Programming/삽질일지

[11/21 TIS] 아니 그니까 그게 왜 비어있는데요; - 메소드 mocking 시 객체를 넘겨주려면 equals()와 hashCode()를 구현하라

by JKROH 2023. 11. 21.
반응형

 컨트롤러 계층의 테스트를 만들면서, 내가 생각한대로 테스트가 작동하지 않았다. 이게 분명히 테스트가 통과되어야 할 것 같이 구현했는데, 자꾸 통과하지 못하는 것이다. 뭐가 문제인지 콘솔을 살펴보니 Response Body가 통째로 비어있었다.

아니 선생님

 이게 뭔 일인가 싶어 Postman을 켜서 같은 동작을 수행해보았다.

잘.. 되는데?

 이러면 기능 구현에는 문제가 없어보였다. 테스트 코드에 뭐가 문제인지를 알아야했다. 이럴 때는 2023년에 살고있는게 참 좋다. 구글은 검색하면 다 알려준다. 관련해서 참고한 두 글의 링크를 남겨놓는다.

 

https://velog.io/@devmizz/Spring-WebMvcTest%EC%97%90%EC%84%9C-Response-Body%EA%B0%80-Empty%EC%9D%BC-%EB%95%8C

 

[Spring/Test] WebMvcTest에서 Response Body가 Empty일 때

WebMvcTest를 진행하는데, MockHttpServletResponse의 Body가 비어있다.

velog.io

 

https://copyprogramming.com/howto/spring-boot-mockmvctest-mockhttpservletresponse-always-returns-empty-body#google_vignette

 

 핵심은 mocking에 있었다. 내가 사용하던 mock 코드는 다음과 같다.

given(freeBoardService.postFreeBoard(testPost)).willReturn(testResponse);

 

 문제는 Mockito에서 given()절을 수행할 때, equals를 통해 객체를 비교하고 return 해주는 점에 있었다. 나는 DTO에 equals를 구현하지 않았다. 그럼 이제 해결 방법은 두 가지가 있었다.

  1. equals()와 hashCode()를 적절히 구현한다.
  2. any()를 사용한다.

 나는 2번의 방법을 사용했다. 이유는 다음과 같다.

  • 어짜피 내가 테스트하고 싶은건 뭔가 Post DTO를 넣었을 때, 입력한 값과 같은 값들을 가진 Response DTO가 생성되는지가 아니다. 이건 Service를 테스트할 때 이미 작성했다.
  • 그렇다면, 일단 Response DTO가 반환되게만 만들어 놓고, 최종적으로 Controller의 메서드가 반환하는 값이 Post DTO의 값과 같은지만 확인하면 된다.
  • DTO 따위에 시간 들여서 equals()와 hashCode()를 구현할 필요는 없다. 귀찮다.

 문제는 잘 해결됐으며, 이번 기회로 객체 인스턴스를 사용해서 Mockito의 동작을 적절히 수행하기 위해서는 equals() 가 필요함을 알게 되었다.

반응형

댓글