MockitoのArgumentMatcherの使い方

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()));
//becomes
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());