mock injectmocks captor java list mockito

java - injectmocks - mockito verify spy



mockito anyList de un tamaƱo dado (2)

Estoy comprobando con mockito que se ha llamado a un método. El método:

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

Dado que no importa qué lista se pasa, verifico que el método se llame de la siguiente manera:

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

Pero, el tamaño de la List es importante. Por lo tanto, no importa qué List pero la lista debe tener X elementos.

¿Es eso posible?


Hamcrest proporciona una forma más sencilla.

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


Una forma es usar un Captor

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

Consulte http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#15 para obtener la documentación.

También puedes usar un argumento personalizado. La documentación muestra un ejemplo que hace exactamente lo que quieres:

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

Por ejemplo, también podría agregar un constructor para que pueda especificar el tamaño de lista deseado, etc.