본문 바로가기
Develop/Java

[Mockito] Invalid use of argument matchers! 에러

by 연로그 2023. 9. 27.
반응형

😱 에러 발생

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

 


참고

 

img: https://www.flaticon.com/free-icons/exception

반응형