Как вы пишете юнит-тесты
Вопрос
Как вы пишете юнит-тесты? Что делает тест хорошим?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Структура given-when-then (arrange-act-assert)
Изоляция зависимостей моками, тест одного поведения
Позитивные, негативные и граничные случаи
Детерминизм: Clock, без sleep и зависимости от порядка
Понятные имена, проверка поведения, а не реализации
Быстрые: без сети и БД в юнит-тестах
Что могут спросить следом
- Что вы мокаете, а что нет?
- Как вы относитесь к метрике покрытия?
Разбор
Каждый тест проверяет одно поведение и строится по схеме given-when-then: подготовил данные, вызвал метод, проверил результат. Внешние зависимости класса, то есть репозитории, клиенты, часы, подменяю моками или фейками, а простые объекты-значения создаю настоящие. Кроме счастливого пути пишу негативные и граничные случаи: пустой список, ноль, null, максимальные значения, исключения через assertThrows. Тест должен быть детерминированным: время через Clock, никакого Thread.sleep, независимость от порядка. Имя теста описывает сценарий, например rejectsExpiredCoupon. Проверяю наблюдаемое поведение, а не каждый внутренний вызов, иначе тесты ломаются от рефакторинга. Покрытие использую как подсказку, где тестов нет, а не как цель.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.