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() 를 두 가지 케이스로 정의했는데
- selectUserAge(USER_ID_HA)
- selectUserAge(USER_ID_KIM)
실제로 테스트 코드에 실행되는건 `selectUserAge(USER_ID_HA)` 뿐이라서,
`selectUserAge(USER_ID_KIM)` 은 사용하지 않으니 정리하라는 뜻의 에러메세지가 노출된 것이다.
(Clean & maintainable test code requires zero unnecessary code)
이에 대한 해결방법은 여러가지가 있으니 참고하여 해결하자 :)
- 필요없는 setUp 단계라면 과감하게 제거하자!
- 필요한 setUp 이라면, when 앞에 `Mockito.lenient().when(...)...` 를 추가해주자!
- 물론 그 외에도 다양한 해결방법이 있으니 아래 StackOverFlow 를 참고하자.
반응형
댓글