Используешь ли на проекте моки?

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

Ответ

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

Пример из моего опыта (Java + Mockito):

@Test
void shouldReturnUserWhenFoundInRepository() {
    // 1. Создаём мок репозитория
    UserRepository mockRepository = Mockito.mock(UserRepository.class);
    User expectedUser = new User(1L, "John Doe");

    // 2. Настраиваем поведение мока
    Mockito.when(mockRepository.findById(1L)).thenReturn(Optional.of(expectedUser));

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

    // 4. Выполняем тест
    User actualUser = userService.getUserById(1L);

    // 5. Проверяем результат и взаимодействие
    assertEquals("John Doe", actualUser.getName());
    Mockito.verify(mockRepository).findById(1L); // Верификация вызова
}

Когда я применяю моки:

  • Для тестирования бизнес-логики сервиса без поднятия реальной БД.
  • Для эмуляции различных ответов внешнего API (успех, ошибка, таймаут).
  • Для проверки того, что определённые методы были вызваны с ожидаемыми аргументами (верификация).

Альтернативы и смежные концепции: В зависимости от контекста, вместо моков я могу использовать стабы (stubs) для простой подмены данных или фейки (fakes) — упрощённые, но рабочие реализации (например, in-memory репозиторий для тестов).