Ответ
Да, активно использую моки для изоляции модуля, который тестирую, от его внешних зависимостей. Это позволяет писать быстрые, стабильные и сфокусированные 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 база данных вместо реальной).