본문 바로가기
TIL & WIL

[TIL] #146. 240206 (org.mockito.exceptions.misusing.UnnecessaryStubbingException: Unnecessary stubbings detected.)

by mmm- 2024. 2. 6.
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