mockito any() 사용시 주의사항

greenTea·2024년 4월 6일

mockito any() 사용시 주의사항

Mockito를 사용한 단위 테스트에서, 특정 메소드의 호출을 검증하고 싶을 때 종종 Argument Matchers를 사용합니다. 이러한 Matchers를 사용하면, 메소드 호출 시 특정 인자의 타입이나 값을 원하는 형태로 유연하게 지정할 수 있습니다. 하지만, Mockito는 모든 인자에 대해 Argument Matchers를 사용하거나, 모두 실제 값을 사용해야 한다는 규칙이 있습니다. 혼합하여 사용하는 경우 Mockito는 에러를 발생시킵니다.

문제 상황

다음과 같이 publish 메소드를 검증하고자 할 때,

verify(messagePublishPort, times(1)).publish(receiverId, any(SendMessage.class));

Mockito에서 다음과 같은 에러가 발생합니다:

Invalid use of argument matchers!
2 matchers expected, 1 recorded:
This exception may occur if matchers are combined with raw values:
    //incorrect:
    someMethod(any(), "raw String");
When using matchers, all arguments have to be provided by matchers.
For example:
    //correct:
    someMethod(any(), eq("String by matcher"));

이 에러 메시지는 publish 메소드 호출 시 첫 번째 인자에는 raw 값을 사용하고, 두 번째 인자에는 Matcher를 사용했기 때문에 발생합니다. Mockito는 모든 인자에 대해서 일관성 있게 Matcher를 사용하거나, 모두 실제 값을 사용할 것을 요구합니다.

해결 방안

문제를 해결하기 위해서는 첫 번째 인자에도 Matcher를 사용해야 합니다. 다음은 문제를 해결한 코드 예시입니다:

verify(messagePublishPort, times(1)).publish(eq(receiverId), any(SendMessage.class));

이 예시에서 eq(receiverId)는 첫 번째 인자인 receiverId에 대한 Matcher입니다. 이를 사용함으로써, Mockito의 요구 사항을 충족시키고, 모든 인자에 Matcher를 사용하여 메소드 호출을 유연하게 검증할 수 있습니다.

예시 코드 분석

  • 잘못된 사용 예: 첫 번째 인자에 raw 값(receiverId), 두 번째 인자에 any(SendMessage.class) Matcher를 사용한 경우입니다.
  • 올바른 사용 예: eq(receiverId)로 첫 번째 인자에도 Matcher를 사용하여 Mockito의 규칙에 맞게 작성한 경우입니다.

참고

Argument Matcher에 대해서 잘 모르시는 분들의 경우에는 ArgumentMatchers - mockito-core 5.11.0 javadoc에서 어떠한 종류들이 있는지 확인해보시면 좋을 것 같습니다.

참고자료

baeldung - Mockito ArgumentMatchers
ArgumentMatchers - mockito-core 5.11.0 javadoc

profile
greenTea입니다.

0개의 댓글