Что такое 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.
Эти тестовые двойники помогают изолировать тестируемый код, обеспечивая надежность и точность модульных тестов.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться