org.mockito.exceptions.misusing.UnnecessaryStubbingException: Unnecessary stubbings detected.
Service단 테스트 코드를 작성하던 중, 이와 같은 에러가 발생했다. 이는 코드의 엄격성을 높여주기 위한 에러로,
- 사용되지 않는 stub을 줄여줌
- 불필요한 코드 중복을 없애줌
- 죽은 코드를 제거하면서 생기는 불필요한 테스트를 없애줌
- 디버깅 편의성과 생산 효율을 높여줌
이러한 것들을 보장해준다.
해당 에러를 해결하기 위해서는 Mockito.lenient().when을 사용하면 된다. 이는 해당 스텁이 테스트의 주요 부분이 아니라는 것을 나타내 해당 stubbing이 미사용될 수 있음을 표시하는 것이다. 이는 에러를 해결하기 위한 방법 중 하나로 사용하면 유용할 수는 있으나, 문제를 일으키는 경우도 있다. 예를 들어, 실제로 테스트해야하는 부분이 호출되지 않았음에도 불구하고 테스트가 성공하게 되는 등의 문제가 발생할 수 있다.
그렇기 때문에 이를 되도록이면 사용하지 않는 것이 좋다고 본다. 그래서 나는 해당 에러가 발생한 이유를 파악하고 그 부분을 지워주거나 변경해주는 방법을 선택했다.
일단 내 코드에서 발생한 원인 중 하나는 실제로는 사용하지 않는 코드를 테스트 코드에서 확인했기 때문이다.
userService.updateInfo() 메서드에서는 findByNickname이 아닌, existsByNickname을 사용하기 때문에 코드를
given(userRepository.findByNickname(TEST_ANOTHER_USER_NICKNAME)).willReturn(false);
이 아닌, 아래와 같이 수정해줬다.
given(userRepository.existsByNickname(TEST_ANOTHER_USER_NICKNAME)).willReturn(false);
이후에도 stub관련 에러가 발생했었는데 이는 잘못된 비밀번호로 실패하는 테스트였다. 비밀번호 확인 후, 닉네임 중복 확을 하는데 비밀번호가 틀릴 경우 비밀번호 확인 이후의 코드는 보지 않아
given(userRepository.existsByNickname(TEST_ANOTHER_USER_NICKNAME)).willReturn(false);
해당 코드가 불필요하다고 판단되어 발생하는 에러였다. 그래서 해당 코드를 지워 문제를 해결했다.
참고 블로그
- https://widian.github.io/java/2021/08/15/mockito-%EC%82%AC%EC%9A%A9-%EC%A4%91-Unnecessary-Stubbing-Exception-%ED%95%B4%EC%86%8C%ED%95%98%EA%B8%B0.html
- https://vvh-avv.tistory.com/269
'TIL & WIL' 카테고리의 다른 글
[TIL] #149. 240209 (0) | 2024.02.09 |
---|---|
[TIL] #147. 240207 (Controller 테스트 코드 작성시 발생한 오류와 해결 방법) (0) | 2024.02.07 |
[TIL] #145. 240205 (MySQL CASE문 / 백준허브 이슈) (0) | 2024.02.05 |
[TIL] #144. 240204 (MySQL LEFT) (0) | 2024.02.04 |
[TIL] #143. 240203 (MySQL GroupBy) (0) | 2024.02.03 |