it-swarm.com.de

mockito anyList einer bestimmten Größe

Ich überprüfe mit Mockito, dass eine Methode aufgerufen wurde. Die Methode:

public void createButtons(final List<Button> buttonsConfiguration) {...}

Da es keine Rolle spielt, welche Liste übergeben wird, überprüfe ich, ob die Methode wie folgt aufgerufen wird:

verify(mock).createButtons(Matchers.anyListOf(Button.class));

Die Größe von List ist jedoch wichtig. Es ist also egal, welches List, aber die Liste muss X-Elemente enthalten.

Ist das überhaupt möglich

36
iberbeu

Eine Möglichkeit ist die Verwendung eines Captors

ArgumentCaptor<List> captor = ArgumentCaptor.forClass(List.class);
verify(mock).createButtons(captor.capture());
assertEquals(x, captor.getValue().size()); // or if expecting multiple lists:
assertEquals(x, captor.getValues().size());

Siehe http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#15 für die Dokumentation.

Sie können auch einen benutzerdefinierten Argumentvergleich verwenden. Die Dokumentation zeigt ein Beispiel, das genau das tut, was Sie wollen:

http://docs.mockito.googlecode.com/hg/org/mockito/ArgumentMatcher.html

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

Sie können beispielsweise auch einen Konstruktor hinzufügen, um die gewünschte Listengröße usw. anzugeben.

65
JB Nizet

Hamcrest bietet einen einfacheren Weg.

verify(mock).addAll(argThat(IsCollectionWithSize.hasSize(4)));
21
mrog