http://docs.mockito.googlecode.com/hg/latest/org/mockito/ArgumentMatcher.htmlを見ると、このクラスを使って以下のように、IsListOfTwoElementsクラスのような独自のArgument Matcherを作る事が出来る。
class IsListOfTwoElements extends ArgumentMatcher<List> {
public boolean matches(Object list) {
return ((List) list).size() == 2;
}
}
List mock = mock(List.class);
when(mock.addAll(argThat(new IsListOfTwoElements()))).thenReturn(true);
mock.addAll(Arrays.asList("one", "two"));
verify(mock).addAll(argThat(new IsListOfTwoElements()));
また、argThat(new IsListOfTwoElements())の所は、以下のようにメソッドにすると、可読性が高くなると書かれている。
verify(mock).addAll(argThat(new IsListOfTwoElements()));
verify(mock).addAll(listOfTwoElements());
メソッドにするやり方は書かれていないが、以下のようにすれば良い。
class IsListOfTwoElements extends ArgumentMatcher<List> {
public boolean matches(Object list) {
return ((List) list).size() == 2;
}
public static List listOfTwoElements() {
return argThat(new IsListOfTwoElements());
}
}
ちなみにジェネリックを使うと以下のような感じか。
class IsListOfTwoElements extends ArgumentMatcher<List<String>> {
@Override
public boolean matches(Object list) {
return ((List<?>) list).size() == 2;
}
public static List<String> listOfTwoElements() {
return argThat(new IsListOfTwoElements());
}
}
@SuppressWarnings("unchecked")
List<String> mock = mock(List.class);
when(mock.addAll(argThat(new IsListOfTwoElements()))).thenReturn(true);
mock.addAll(Arrays.asList("one", "two"));
verify(mock).addAll(listOfTwoElements());