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-го слоя).