Mockito
Mockito — библиотека для создания “поддельных” объектов в тестах. Нужна, когда класс, который тестируешь, зависит от чего-то медленного или непредсказуемого (база данных, внешний API) — и в тесте этого реального компонента быть не должно.
@Test
void shouldReturnUserName() {
UserRepository mockRepo = mock(UserRepository.class); // подделка вместо реальной БД
when(mockRepo.findById(1)).thenReturn(new User(1, "Артур"));
UserService service = new UserService(mockRepo);
String name = service.getUserName(1);
assertEquals("Артур", name);
}
mock() создаёт фальшивый объект, when(...).thenReturn(...) настраивает, что он должен вернуть на конкретный вызов — реальная база данных в тесте не участвует вообще.
Копнуть глубже
Зачем подделывать зависимости, а не тестировать с реальной БД:
- Скорость. Тесты с реальной БД медленные (сетевые запросы, диск) — с моками тест выполняется за миллисекунды.
- Изоляция. Тестируешь именно логику
UserService, а не корректность работы базы данных — если тест упал, точно знаешь, где искать причину. - Предсказуемость. Реальная БД может быть недоступна, содержать другие данные — мок всегда ведёт себя одинаково.
verify() — проверить, что метод вообще был вызван:
verify(mockRepo).findById(1); // убеждаемся, что findById реально вызвали с id=1
verify(mockRepo, times(1)).save(any()); // вызван ровно один раз
Это полезно, когда важен не возврат значения, а сам факт взаимодействия — например, что метод сохранения точно вызвался после успешной валидации.
🎤 Закрыл тему, если можешь объяснить:
• зачем нужен mock и как его настроить через `when/thenReturn`;
• что проверяет `verify()` и зачем (если дошёл до 2-го слоя).
• что проверяет `verify()` и зачем (если дошёл до 2-го слоя).