Методы Mocking Void с Mockito

Методы насмешливой пустоты с помощью Mockito

1. обзор

В этом коротком руководстве мы сосредоточимся на имитации методовvoid с помощью Mockito.

Дальнейшее чтение:

Возможности Mockito Java 8

Обзор поддержки Java 8 в инфраструктуре Mockito, включая потоки и методы интерфейса по умолчанию

Read more

Насмешливое Бросание Исключений с использованием Мокито

Научитесь настраивать вызов метода для выдачи исключения в Mockito.

Read more

Как и в других статьях, посвященных фреймворку Mockito (например,Mockito Verify,Mockito When/Then иMockito’s Mock Methods), показанный ниже классMyList будет использоваться в качестве соавтора в тестовых примерах. Мы добавим новый метод для этого урока:

public class MyList extends AbstractList {

    @Override
    public void add(int index, String element) {
        // no-op
    }
}

2. Простая фиксация и проверка

МетодыVoid можно использовать с методамиdoNothing(), doThrow(), and doAnswer() Mockito, что делает насмешку и проверку интуитивно понятными:

@Test
public void whenAddCalledVerified() {
    MyList myList = mock(MyList.class);
    doNothing().when(myList).add(isA(Integer.class), isA(String.class));
    myList.add(0, "");

    verify(myList, times(1)).add(0, "");
}

ОднакоdoNothing() - это поведение Mockito по умолчанию для методов void.

Эта версияwhenAddCalledVerified() выполняет то же самое, что и предыдущая:

@Test
public void whenAddCalledVerified() {
    MyList myList = mock(MyList.class);
    myList(0, "");

    verify(myList, times(1)).add(0, "");
}

DoThrow() генерирует исключение:

@Test(expected = Exception.class)
public void givenNull_AddThrows() {
    MyList myList = mock(MyList.class);
    doThrow().when(myList).add(isA(Integer.class), isNull());

    myList.add(0, null);
}

Мы рассмотримdoAnswer() ниже.

3. Захват аргумента

Одна из причин переопределить поведение по умолчанию с помощьюdoNothing() - это захват аргументов.

В приведенном выше примереverify() используется для проверки аргументов, переданныхadd().

Тем не менее, нам может потребоваться зафиксировать аргументы и сделать с ними что-то большее. В этих случаях мы используемdoNothing() так же, как и выше, но сArgumentCaptor:

@Test
public void whenAddCalledValueCaptured() {
    MyList myList = mock(MyList.class);
    ArgumentCaptor valueCapture = ArgumentCaptor.forClass(String.class);
    doNothing().when(myList).add(any(Integer.class), valueCapture.capture());
    myList.add(0, "captured");

    assertEquals("captured", valueCapture.getValue());
}

4. Ответ на вызовVoid

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

@Test
public void whenAddCalledAnswered() {
    MyList myList = mock(MyList.class);
    doAnswer((Answer) invocation -> {
        Object arg0 = invocation.getArgument(0);
        Object arg1 = invocation.getArgument(1);

        assertEquals(3, arg0);
        assertEquals("answer me", arg1);
        return null;
    }).when(myList).add(any(Integer.class), any(String.class));
    myList.add(3, "answer me");
}

Как объяснено вMockito’s Java 8 Features, мы используем лямбда сAnswer для определения пользовательского поведения дляadd().

5. Частичное издевательство

Частичные насмешки тоже возможны. Mockito'sdoCallRealMethod() можно использовать для методовvoid:

@Test
public void whenAddCalledRealMethodCalled() {
    MyList myList = mock(MyList.class);
    doCallRealMethod().when(myList).add(any(Integer.class), any(String.class));
    myList.add(1, "real");

    verify(myList, times(1)).add(1, "real");
}

Это позволяет нам вызвать фактический вызываемый метод и одновременно проверить его.

6. Заключение

В этом кратком руководстве мы рассмотрели четыре различных подхода к методамvoid при тестировании с помощью Mockito.

Как всегда, примеры доступны вthis GitHub project.