0

Mockito: anyList() заданного размера

11

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

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

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

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

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

Есть ли возможность проверить этот сценарий в Mockito?

3 ответ(ов)

0

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

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

0

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

Таким образом, использование лямбда-выражений значительно упрощает код проверки аргументов в моках.

0

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

Такой способ делает код более читаемым и позволяет легко проверять размер коллекции.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь