Mockito: anyList() заданного размера
Я проверяю с помощью Mockito, что метод был вызван. Метод выглядит следующим образом:
public void createButtons(final List<Button> buttonsConfiguration) {...}
Поскольку не имеет значения, какой список передан, я проверяю, что метод был вызван, следующим образом:
verify(mock).createButtons(Matchers.anyListOf(Button.class));
Однако размер списка важен. То есть не имеет значения, какой именно список, но он должен содержать X элементов.
Есть ли возможность проверить этот сценарий в Mockito?
3 ответ(ов)
Одним из способов проверки является использование ArgumentCaptor
:
ArgumentCaptor<List> captor = ArgumentCaptor.forClass(List.class);
verify(mock).createButtons(captor.capture());
assertEquals(x, captor.getValue().size()); // если ожидается единичный список
assertEquals(x, captor.getValues().size()); // если ожидается несколько списков
Документацию можно найти по следующей ссылке: Mockito Documentation.
Вы также можете использовать настраиваемый матчер аргументов. В документации приведен пример, который делает именно то, что вам нужно:
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()));
Вы можете, например, добавить конструктор, чтобы можно было указывать желаемый размер списка и т. д.
С Mockito версии 3.x и 2.1+ вы можете использовать лямбда-выражения Java 8:
verify(mock).createButtons(argThat(list -> list.size() == 5));
Для Mockito версии 2.1 и ниже аналогичный код будет выглядеть так:
verify(mock).createButtons(argThat(list -> ((List) list).size() == 5));
Для проверки на пустоту даже проще:
verify(mock).createButtons(argThat(List::isEmpty));
Таким образом, использование лямбда-выражений значительно упрощает код проверки аргументов в моках.
Hamcrest (зависимость hamcrest-library) предлагает более простой способ проверки.
Вы можете использовать следующий подход:
verify(mock).addAll((List) argThat(IsCollectionWithSize.hasSize(4)));
Либо с использованием статического импорта:
import static org.hamcrest.collection.IsCollectionWithSize.hasSize;
verify(mock).addAll((List) argThat(hasSize(4)));
Такой способ делает код более читаемым и позволяет легко проверять размер коллекции.
Как создать новый список в Java
Mockito: Тестирование void метода, который выбрасывает исключение
Использование Mockito для мокирования некоторых методов, но не всех
Можно ли с помощью Mockito захватывать аргументы метода, вызываемого несколько раз?
Java PriorityQueue с фиксированным размером