← Назад ко всем вопросам

Что такое mock, stub, spy, fake

1️⃣ Как кратко ответить

Mock, stub, spy и fake — это виды тестовых двойников, используемых в модульном тестировании для изоляции тестируемого кода. Mock — объект, который проверяет поведение тестируемого кода. Stub — объект, который возвращает заранее определенные ответы. Spy — объект, который записывает информацию о вызовах методов. Fake — объект, который заменяет реальную функциональность упрощенной версией.

2️⃣ Подробное объяснение темы

В модульном тестировании часто необходимо изолировать тестируемый код от его зависимостей. Для этого используются тестовые двойники, которые имитируют поведение реальных объектов. Рассмотрим каждый из них подробнее.

Mock

Mock-объекты используются для проверки взаимодействия тестируемого кода с его зависимостями. Они позволяют убедиться, что определенные методы были вызваны с ожидаемыми параметрами. Mock-объекты обычно создаются с помощью специальных библиотек, таких как Mockito в Java.

Пример использования mock:

// Импортируем необходимые классы из библиотеки Mockito
import static org.mockito.Mockito.*;
​
// Создаем mock-объект для интерфейса List
List<String> mockedList = mock(List.class);
​
// Определяем поведение mock-объекта: при вызове метода add возвращать true
when(mockedList.add("one")).thenReturn(true);
​
// Вызываем метод add
mockedList.add("one");
​
// Проверяем, что метод add был вызван с параметром "one"
verify(mockedList).add("one");
  • mock(List.class): Создает mock-объект для интерфейса List.
  • when(mockedList.add("one")).thenReturn(true): Определяет поведение mock-объекта.
  • verify(mockedList).add("one"): Проверяет, что метод add был вызван с параметром "one".

Stub

Stub-объекты возвращают заранее определенные ответы на вызовы методов. Они не проверяют взаимодействие, а просто предоставляют данные для тестирования.

Пример использования stub:

// Создаем stub-объект для интерфейса Calculator
Calculator calculatorStub = mock(Calculator.class);
​
// Определяем поведение stub-объекта: метод add возвращает 5
when(calculatorStub.add(2, 3)).thenReturn(5);
​
// Вызываем метод add и получаем результат
int result = calculatorStub.add(2, 3);
​
// result будет равен 5
  • when(calculatorStub.add(2, 3)).thenReturn(5): Определяет, что метод add должен возвращать 5 при вызове с параметрами 2 и 3.

Spy

Spy-объекты записывают информацию о вызовах методов и позволяют частично использовать реальную функциональность объекта. Они полезны, когда нужно проверить, как часто и с какими параметрами вызываются методы.

Пример использования spy:

// Создаем реальный объект ArrayList
List<String> list = new ArrayList<>();
​
// Создаем spy-объект на основе реального объекта
List<String> spyList = spy(list);
​
// Добавляем элемент в spy-объект
spyList.add("one");
​
// Проверяем, что метод add был вызван
verify(spyList).add("one");
​
// spy-объект сохраняет реальное состояние
assertEquals(1, spyList.size());
  • spy(list): Создает spy-объект на основе реального объекта list.
  • verify(spyList).add("one"): Проверяет, что метод add был вызван.

Fake

Fake-объекты заменяют реальную функциональность упрощенной версией. Они могут содержать некоторую логику, но обычно проще и быстрее, чем реальные объекты.

Пример использования fake:

// Реализуем fake-объект для интерфейса Database
class FakeDatabase implements Database {
    private Map<String, String> data = new HashMap<>();
​
    @Override
    public void save(String key, String value) {
        data.put(key, value);
    }
​
    @Override
    public String get(String key) {
        return data.get(key);
    }
}
​
// Используем fake-объект в тесте
Database fakeDatabase = new FakeDatabase();
fakeDatabase.save("key1", "value1");
String value = fakeDatabase.get("key1");
​
// value будет равно "value1"
  • FakeDatabase: Реализует интерфейс Database с упрощенной логикой.
  • save и get: Методы, которые сохраняют и извлекают данные из внутренней структуры Map.

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

Тема: Тестирование
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки