Ответ вслух Middle Тестирование: JUnit 5 и Mockito обновлено

Что мокать, а что нет

Вопрос

Где вы используете моки, а где предпочитаете настоящие зависимости или Testcontainers?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Мокаю границы системы: внешние HTTP-сервисы, брокеры, почту, а также время и случайность. Объекты-значения, DTO и чистую логику не мокаю, их проще создать настоящими.

Что должно прозвучать в ответе

  • Мокать границы: внешние API, очереди, время

  • Не мокать объекты-значения и простую логику

  • БД лучше проверять на настоящей СУБД через Testcontainers, а не H2

  • Не мокать то, чем не владеешь, без обёртки (адаптер)

  • Слишком много моков = сигнал о плохом дизайне

Что могут спросить следом

  • Почему H2 вместо PostgreSQL в тестах опасен?
  • Что такое контрактные тесты?

Разбор

Мокаю границы системы: внешние HTTP-сервисы, брокеры, почту, а также время и случайность. Объекты-значения, DTO и чистую логику не мокаю, их проще создать настоящими. Слой работы с базой проверяю интеграционными тестами на настоящем PostgreSQL в Testcontainers: H2 отличается диалектом, блокировками, типами, и тест может пройти там, где прод упадёт. Сторонние SDK стараюсь не мокать напрямую, а оборачиваю своим адаптером и мокаю его, а сам адаптер проверяю отдельно, например через WireMock. Если для теста одного класса нужно пять моков с длинными цепочками стабов, это сигнал, что у класса слишком много обязанностей.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме