Mockito and Argument mathcersby Pigbrain

Argument matchers

  • Mockito는 기본적으로 Object의 equals()메서드를 이용하여 argument 값을 확인한다
  • argument mathcher를 이용하면 custom하게 argument 값을 확인할 수도 있다
    • 어떤 메서드의 argument가 특정 값일 때만 평가되도록 하기 위해서는 argument matcher를 사용해야한다
    • anyXXX()와 같은 함수로 argument를 비교하게되면 argument에 어떠한 값이 들어오더라도 전부다 실행된다
  
// 아무런 int값이 가능하다면 anyInt를 사용하면 된다
when(mockedList.get(anyInt())).thenReturn("element");
  
// custom한 argument matcher는 아래와 같이 호출한다  
when(mockedList.contains(argThat([ArgumentMatcher<T>]))).thenReturn("element");
  
// 자바8의 람다를 이용하면 다음 처럼 argument matcher를 작성 할 수 있다  
verify(mockedList).add(argThat(someString -> someString.length() > 5));

Interface ArgumentMatcher

  • ArgumentMatcher 인터페이스의 matches 메소드를 통하여 argument를 비교한다
  
class ListOfTwoElements implements ArgumentMatcher<List> {
	public boolean matches(List list) {
		return list.size() == 2;
	}
	public String toString() {
		return "[list of 2 elements]";
	}
}  
  
List mock = mock(List.class);  
  
// addAll 메서드의 argument(List)의 size()가 2인 경우에만 실행된다  
when(mock.addAll(argThat(new ListOfTwoElements))).thenReturn(true);  
  
mock.addAll(Arrays.asList("one", "two"));  
  
verify(mock).addAll(argThat(new ListOfTwoElements()));  

참고

  • http://static.javadoc.io/org.mockito/mockito-core/2.2.21/org/mockito/Mockito.html
  • http://static.javadoc.io/org.mockito/mockito-core/2.2.21/org/mockito/ArgumentMatcher.html
Published 19 November 2016