Тестовые двойники: Stubs vs. Mocks vs. Fakes vs. Spys
Это материал содержит определения тестовых двойников с примерами экзаменационных вопросов и ключевыми терминами.
В двух словах
- Stub: возвращает заранее определённые значения
- Mock: проверяет взаимодействия и ожидания
- Fake: упрощённая, но функциональная реализация
- Spy: записывает вызовы для последующей проверки (комбинация Stub и Mock)
Определения
Stub
Возвращает фиксированные значения без проверки поведения. Подходит для тестов, где не важно состояние.
Mock
Проверяет, что определённые методы вызваны с нужными параметрами. Необходим, когда взаимодействие между компонентами критично.
Fake
Работающая, но упрощённая реализация (например, база данных в памяти). Полезен для unit-тестов, близких к интеграционным.
Spy
Сохраняет информацию о вызовах для проверки их позже (гибрид между Stub и Mock).
Ключевые моменты для экзамена
- Stub: предопределённые ответы, без проверки поведения
- Mock: определение и верификация ожиданий
- Fake: функциональное упрощение (например, хранилище в памяти)
- Spy: запись вызовов для последующей проверки
- Когда использовать: Stub для состояния, Mock для поведения, Fake для сложности
- Инструменты: Mockito, unittest.mock, Jest
Основные компоненты
- Stub (ответы)
- Mock (ожидания)
- Fake (упрощённая реализация)
- Spy (запись)
- Изоляция тестов
- Работа с фреймворками
- Setup/Teardown
- Assertions
- Верификация
- Поддержка кода
Практический пример (сервис скидок)
// Stub
DiscountPolicy stub = new DiscountPolicyStub(10); // всегда 10%
int rabatt = service.berechneRabatt(kunde, artikel);
// Mock
DiscountPolicy mock = mock(DiscountPolicy.class);
when(mock.getRabatt(kunde)).thenReturn(10);
verify(mock).getRabatt(kunde);
// Fake
InMemoryDiscountRepository fake = new InMemoryDiscountRepository();
fake.add(new Discount(kunde, 10));
// Spy
DiscountPolicySpy spy = new DiscountPolicySpy();
service.berechneRabatt(kunde, artikel);
assertEquals(1, spy.getCallCount());
Типичные экзаменационные вопросы (с кратким ответом)
- В чём разница между Stub и Mock? Stub возвращает ответы, Mock проверяет вызовы.
- Когда использовать Fake? Когда нужна функциональная упрощённая реализация (например, база данных в памяти).
- Что делает Spy? Записывает вызовы и позволяет проверить их позже.
Основные источники
- https://martinfowler.com/articles/mocksArentStubs.html
- https://junit.org/junit5/docs/current/user-guide/
- https://testing.googleblog.com



