Mockito’s Mock Methods

Mockito Mock Методы

1. обзор

В этом руководстве показаны различные варианты использования стандартных статических методовmock APIMockito.

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

public class MyList extends AbstractList {
    @Override
    public String get(int index) {
        return null;
    }

    @Override
    public int size() {
        return 1;
    }
}

2. Простое издевательство

Самый простой перегруженный вариант методаmock - это тот, у которого есть единственный параметр для имитируемого класса:

public static  T mock(Class classToMock)

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

MyList listMock = mock(MyList.class);
when(listMock.add(anyString())).thenReturn(false);

Затем выполните метод на макете:

boolean added = listMock.add(randomAlphabetic(6));

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

verify(listMock).add(anyString());
assertThat(added, is(false));

3. Издевательство с псевдонимом

В этом разделе мы рассмотрим другой вариант методаmock, который предоставляется с аргументом, указывающим имя макета:

public static  T mock(Class classToMock, String name)

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

Чтобы убедиться, что предоставленное имя макета включено в сообщение об исключении, созданном в результате неудачной проверки, мы будем полагаться на реализацию JUnit интерфейсаTestRule, называемуюExpectedException, и включать ее. в тестовом классе:

@Rule
public ExpectedException thrown = ExpectedException.none();

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

В следующем коде мы создаем макет классаMyList и называем егоmyMock:

MyList listMock = mock(MyList.class, "myMock");

Затем установите ожидание для метода макета и выполните его:

when(listMock.add(anyString())).thenReturn(false);
listMock.add(randomAlphabetic(6));

Мы создадим намеренно не пройденную проверку, которая должна выдать исключение с сообщением, содержащим информацию о макете. Для этого сначала необходимо установить ожидания для исключения:

thrown.expect(TooLittleActualInvocations.class);
thrown.expectMessage(containsString("myMock.add"));

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

verify(listMock, times(2)).add(anyString());

Вот сообщение о возникшем исключении:

org.mockito.exceptions.verification.TooLittleActualInvocations:
myMock.add();
Wanted 2 times:
at com.example.mockito.MockitoMockTest
  .whenUsingMockWithName_thenCorrect(MockitoMockTest.java:...)
but was 1 time:
at com.example.mockito.MockitoMockTest
  .whenUsingMockWithName_thenCorrect(MockitoMockTest.java:...)

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

4. Мокинг сAnswer

Здесь мы продемонстрируем использование вариантаmock, в котором стратегия ответов макета на взаимодействие настраивается во время создания. Подпись этого методаmock в документации Mockito выглядит следующим образом:

public static  T mock(Class classToMock, Answer defaultAnswer)

Начнем с определения реализации интерфейсаAnswer:

class CustomAnswer implements Answer {
    @Override
    public Boolean answer(InvocationOnMock invocation) throws Throwable {
        return false;
    }
}

Приведенный выше классCustomAnswer используется для создания макета:

MyList listMock = mock(MyList.class, new CustomAnswer());

Если мы не устанавливаем ожидание для метода, в игру вступает ответ по умолчанию, который был настроен типомCustomAnswer. Чтобы доказать это, мы пропустим шаг установки ожидания и перейдем к выполнению метода:

boolean added = listMock.add(randomAlphabetic(6));

Следующая проверка и утверждение подтверждают, что методmock с аргументомAnswer работал должным образом:

verify(listMock).add(anyString());
assertThat(added, is(false));

5. Мокинг сMockSettings

Последний методmock, который рассматривается в этой статье, - это вариант с параметром типаMockSettings. Этот перегруженный метод используется для предоставления нестандартного макета.

Существует несколько пользовательских настроек, которые поддерживаются методами интерфейсаMockSettings, например, регистрация слушателя для вызовов методов в текущем макете с помощьюinvocationListeners, настройка сериализации с помощьюserializable, указание экземпляра шпионить с помощьюspiedInstance, настраивая Mockito для попытки использовать конструктор при создании экземпляра макета с помощьюuseConstructor и некоторых других.

Для удобства мы повторно используем классCustomAnswer, представленный в предыдущем разделе, для создания реализацииMockSettings, которая определяет ответ по умолчанию.

ОбъектMockSettings создается фабричным методом следующим образом:

MockSettings customSettings = withSettings().defaultAnswer(new CustomAnswer());

Этот установочный объект будет использоваться при создании нового макета:

MyList listMock = mock(MyList.class, customSettings);

Как и в предыдущем разделе, мы вызовем методadd экземпляраMyList и проверим, что методmock с аргументомMockSettings работает так, как задумано, используя следующий фрагмент кода:

boolean added = listMock.add(randomAlphabetic(6));
verify(listMock).add(anyString());
assertThat(added, is(false));

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

В этом руководстве подробно рассматривается методmock в Mockito. Реализацию этих примеров и фрагментов кода можно найти вa GitHub project.