Подтвердить что ты не робот

Mockito anyList данного размера

Я проверяю с помощью mockito, что метод был вызван. Метод:

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

Поскольку не имеет значения, какой список передан, я проверяю, что метод вызывается следующим образом:

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

Но размер List важен. Таким образом, не имеет значения, какой List, но список должен иметь X элементов.

Возможно ли это вообще?

4b9b3361

Ответ 1

Один из способов - использовать 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());

См. http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#15 для документации.

Вы также можете использовать собственный сопоставитель аргументов. В документации показан пример, который делает именно то, что вы хотите:

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

Вы также можете добавить конструктор, чтобы указать желаемый размер списка и т.д.

Ответ 2

Hamcrest обеспечивает более простой способ.

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

Ответ 3

В Mockito 3.x (и, возможно, 2.x) вы можете использовать лямбда-выражения Java 8:

verify(mock).createButtons(argThat(list -> list.size() == 5));

Проверить пустоту еще проще:

verify(mock).createButtons(argThat(List::isEmpty));