Использовал ли моки (Mock) в модульном тестировании?

«Использовал ли моки (Mock) в модульном тестировании?» — вопрос из категории Фреймворки тестирования, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, активно использую моки для изоляции модуля, который тестирую, от его внешних зависимостей. Это позволяет писать быстрые, стабильные и сфокусированные unit-тесты.

Пример с Mockito в Java для тестирования сервиса, работающего с базой данных:

import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;

@Test
void getUser_ShouldReturnUser_WhenUserExists() {
    // 1. Создаем мок репозитория (зависимость)
    UserRepository userRepositoryMock = mock(UserRepository.class);

    // 2. Задаем поведение мока: при вызове findById(1) возвращаем тестового пользователя
    User testUser = new User(1, "Иван Иванов");
    when(userRepositoryMock.findById(1L)).thenReturn(Optional.of(testUser));

    // 3. Внедряем мок в тестируемый сервис
    UserService userService = new UserService(userRepositoryMock);

    // 4. Вызываем метод сервиса
    User result = userService.getUserById(1L);

    // 5. Проверяем результат и факт взаимодействия с моком
    assertEquals("Иван Иванов", result.getName());
    verify(userRepositoryMock, times(1)).findById(1L); // Верификация: метод был вызван ровно 1 раз
}

Ключевые принципы, которых придерживаюсь:

  • Моки – для проверки взаимодействия (вызван ли метод, с какими аргументами). Использую, например, для проверки вызова логгера или отправки уведомления.
  • Стабы (Stubs) – для подмены состояния (возврата заранее заданных данных). Использую для эмуляции ответов от внешнего API или сложных вычислений.
  • Фейки (Fakes) – для замены тяжелой зависимости на упрощенную, но работающую реализацию (например, in-memory база данных вместо реальной).