Develop/Java
[Mockito] Invalid use of argument matchers! 에러
연로그
2023. 9. 27. 22:42
반응형
😱 에러 발생
org.mockito.exceptions.misusing.InvalidUseOfMatchersException: Invalid use of argument matchers! 2 matchers expected, 1 recorded 에러
아래와 같은 테스트 코드를 실행시키다 위와 같은 에러 로그를 만났다.
var service = mock(MemberFindService.class);
verify(service).findByIdAndName(anyLong(), "yeonlog");
에러를 해석해보자면 argument matchers를 잘못 사용했다. 2개의 matcher가 예상되었지만, 1개만 존재한다. 이 의미를 이해하기 위해서는 argument matchers가 무엇인지 먼저 알아야한다.
🤔 Argument Matchers란?
Mockito에서 stub이나 verify 등을 더 유연하게 작성할 수 있도록 지원해주는 클래스이다. 우리가 Mockito를 이용하여 stub/verify할 때 흔히 사용하던 any(), anyInt(), anyLong(), eq()등이 다 argument matchers이며 이 외에도 더 다양한 종류는 ArgumentMatchers 클래스에서 확인할 수 있다.
when(mock.someMethod(any())).thenReturn(null); // stub
verify(mock).someMethod(any()); // verify
🧐 에러 원인
이제 본격적으로 에러 원인을 찾아보자. Mockito 문서에는 아래와 같은 내용이 있다.
If you are using argument matchers, all arguments have to be provided by matchers.
argument matchers를 사용한다면, 모든 인자들을 matchers여야한다. 좀 더 풀어서 말해보자면, Mockito를 통해 메서드를 stub하려면, 모든 인자를 raw value 또는 argument matcher로 주어져야 한다.
아래 예제를 보면 간단하게 이해할 수 있다.
// example
var service = mock(MemberFindService.class);
// OK
verify(service).findByIdAndName(anyLong(), anyString()); // 모두 ArgumentMatchers
verify(service).findByIdAndName(anyLong(), eq("yeonlog")); // 모두 ArgumentMatchers
verify(service).findByIdAndName(1L, "yeonlog"); // 모두 raw value
// EXCEPTION
verify(service).findByIdAndName(anyLong(), "yeonlog"); // 첫번째 인자는 ArgumentMatchers, 두번째 인자는 raw value
참고
- https://stackoverflow.com/questions/24468456/invalid-use-of-argument-matchers
- https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#when-T-
- https://www.baeldung.com/mockito-argument-matchers
반응형