«1. Обзор

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

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

Мы добавим новый метод для этого урока:

public class MyList extends AbstractList<String> {
 
    @Override
    public void add(int index, String element) {
        // no-op
    }
}

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

Методы Void можно использовать с doNothing(), doThrow() и 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<String> valueCapture = ArgumentCaptor.forClass(String.class);
    doNothing().when(myList).add(any(Integer.class), valueCapture.capture());
    myList.add(0, "captured");
 
    assertEquals("captured", valueCapture.getValue());
}

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

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

В этих ситуациях мы можем использовать ответ Mockito, чтобы добавить необходимое поведение: добавлять().

@Test
public void whenAddCalledAnswered() {
    MyList myList = mock(MyList.class);
    doAnswer(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");
}

5. Частичная имитация

Частичная имитация тоже возможна. Метод doCallRealMethod() Mockito можно использовать для методов 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.

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

«