Mockito and Argument mathcersby Pigbrain

Argument matchers

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

Interface ArgumentMatcher

  • ArgumentMatcher 인터페이스의 matches 메소드를 통하여 argument를 비교한다
  1. class ListOfTwoElements implements ArgumentMatcher<List> {
  2. public boolean matches(List list) {
  3. return list.size() == 2;
  4. }
  5. public String toString() {
  6. return "[list of 2 elements]";
  7. }
  8. }
  9. List mock = mock(List.class);
  10. // addAll 메서드의 argument(List)의 size()가 2인 경우에만 실행된다
  11. when(mock.addAll(argThat(new ListOfTwoElements))).thenReturn(true);
  12. mock.addAll(Arrays.asList("one", "two"));
  13. 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