Ответ
Да, я активно использую моки (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 репозиторий для тестов).