intermediate
Mocks versus fakes
Используйте mocks для interaction checks, fakes для realistic lightweight behavior и избегайте doubles, скрывающих broken contracts.
Test doubles подменяют коллабораторов. Моки (библиотека или spy) проверяют взаимодействия — вызван ли `sendEmail` с нужными args? Фейки дают рабочую облегчённую реализацию — in-memory repository с реальными insert/select.
Моки, когда важен контракт «вызови этот порт»; фейки, когда важны поведение и состояние. Stubs возвращают заготовки; spies записывают вызовы без жёстких ожиданий.
На интервью: рефакторинг с over-mocked на fake repository и какие сбои видит каждый подход.
Типовые ошибки: моки проходят, хотя прод-код порт не вызывает; фейки расходятся с реальной БД; assert порядка вызовов вместо результата.
Компромисс — точность взаимодействий против реализма поведения: много моков ускоряет, но скрывает integration-баги.
Чеклист:
- Тип double — по тому, что нужно доказать.
- Фейки для persistence и часов, когда важно поведение.
- Сброс doubles между тестами.