Gymterview
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 это одно и то же, просто разные названия.