본문 바로가기
Error

[JUnit] org.mockito.exceptions.misusing.UnnecessaryStubbingException

by 지구 2021. 7. 26.

org.mockito.exceptions.misusing.UnnecessaryStubbingException: 
Unnecessary stubbings detected.
Clean & maintainable test code requires zero unnecessary code.
Following stubbings are unnecessary (click to navigate to relevant line of code):
  1. -> at [FQCN].MyServiceTest.setUp(MyServiceTest.java:43)
Please remove unnecessary stubbings or use 'lenient' strictness. More info: javadoc for UnnecessaryStubbingException class.


JUnit 으로 테스트 하다가 위와 같은 오류를 만났다.

 

테스트한 코드는 아래와 같이 Mockito 를 이용해 서비스를 주입 받고, Mock Mapper 객체를 생성한 코드이다.

@ExtendWith(MockitoExtension.class)
class MyServiceTest {

    private static final int USER_ID_HA = 1000;
    private static final int USER_ID_KIM = 1001;

    @InjectMocks
    private MyServiceImpl myService;

    @Mock
    private MyMapper myMapper;

    @BeforeEach
    void setUp() {
        when(myMapper.selectUserAge(USER_ID_HA)).thenReturn(20);
        when(myMapper.selectUserAge(USER_ID_KIM)).thenReturn(10);
    }

    @DisplayName("회원 아이디로 회원 나이 구하기")
    @Test
    void findUserAge() {
        // given
        // when
        int userAge = myService.findUserAge(USER_ID_HA);
        // then
        Assertions.assertThat(userAge).isEquals(20);
    }
}

 

여기서 문제가 되는건,

`setUp` 메소드에서 selectUserAge() 를 두 가지 케이스로 정의했는데

  1. selectUserAge(USER_ID_HA)
  2. selectUserAge(USER_ID_KIM)

실제로 테스트 코드에 실행되는건 `selectUserAge(USER_ID_HA)` 뿐이라서,

`selectUserAge(USER_ID_KIM)` 은 사용하지 않으니 정리하라는 뜻의 에러메세지가 노출된 것이다.
(Clean & maintainable test code requires zero unnecessary code)

 

이에 대한 해결방법은 여러가지가 있으니 참고하여 해결하자 :)

  1. 필요없는 setUp 단계라면 과감하게 제거하자!
  2. 필요한 setUp 이라면, when 앞에 `Mockito.lenient().when(...)...` 를 추가해주자!
  3. 물론 그 외에도 다양한 해결방법이 있으니 아래 StackOverFlow 를 참고하자.
반응형

댓글