junior
Чем stub отличается от mock?
Stub подменяет данные и проверяет состояние результата, а Mock проверяет факт и порядок взаимодействия с зависимостью. Martin Fowler: “Stubs provide canned answers, mocks verify expectations”.
| Критерий | Stub | Mock |
|---|---|---|
| Цель | Подменить данные | Проверить взаимодействие |
| Проверка | Состояние результата (assertEquals) | Факт/количество вызовов (verify) |
| Хрупкость | Низкая – рефакторинг не ломает | Высокая – зависит от реализации |
| Когда использовать | Метод возвращает результат | Метод выполняет side effect |
Пример
Пример
// STUB -- проверяем результат
@Test
void stubExample() {
when(priceService.getPrice("AAPL")).thenReturn(150.0); // stub
double total = portfolio.calculateTotal(); // используем stub
assertEquals(1500.0, total); // проверяем СОСТОЯНИЕ
}
// MOCK -- проверяем взаимодействие
@Test
void mockExample() {
orderService.placeOrder(order);
verify(emailService).sendConfirmation(order.getEmail()); // проверяем ВЫЗОВ
}
Когда что выбирать
- Stub (state testing) – когда метод возвращает значение и результат можно проверить через assert. Тесты менее хрупкие при рефакторинге
- Mock (behavior testing) – когда метод выполняет побочный эффект (отправка email, запись в лог, вызов внешнего API) и единственный способ проверить – убедиться, что вызов произошёл
Частые ошибки
- Verify + when на одном объекте – stub достаточно, verify избыточен
- Mock на каждый метод – тест тестирует реализацию, а не поведение; рефакторинг ломает тест
Как используется в 2026
- Mockito BDD:
given(...).willReturn(...)+then(mock).should().method()– читаемый стиль - Предпочитайте stub (state testing) – тесты менее хрупкие при рефакторинге
На собеседовании: это один из самых частых вопросов по тестированию. Интервьюер хочет услышать конкретную разницу: stub проверяет состояние, mock проверяет поведение. Частая ошибка – сказать, что stub и mock это одно и то же, просто разные названия.