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