В чём разница между Mock и Spy в Mockito? Mockito — фреймворк для тестирования с использованием имитаций Mock — полностью искусственный объект, поведение всех его методов можно настроить Spy — объект на основе реального экземпляра, в котором можно переопределять отдельные методы В отличие от Mock, Spy по умолчанию выполняет настоящие методы объекта С помощью Spy можно проверять поведение реального объекта и одновременно контролировать его вызовы Mock подходит для полной изоляции зависимостей, а Spy — для частичного управления реальным объектом На практике Mock выбирают для полного контроля, а Spy — для тестов, где требуется сочетать…
В чём разница между Mock и Spy в Mockito на собеседовании?
В чём разница между Mock и Spy в Mockito? Mockito — фреймворк для тестирования с использованием имитаций Mock — полностью искусственный объект, поведение всех его методов можно настроить Spy — объект на основе…
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
В чём разница между Mock и Spy в Mockito?
- Mockito — фреймворк для тестирования с использованием имитаций
- Mock — полностью искусственный объект, поведение всех его методов можно настроить
- Spy — объект на основе реального экземпляра, в котором можно переопределять отдельные методы
- В отличие от Mock, Spy по умолчанию выполняет настоящие методы объекта
- С помощью Spy можно проверять поведение реального объекта и одновременно контролировать его вызовы
- Mock подходит для полной изоляции зависимостей, а Spy — для частичного управления реальным объектом
- На практике Mock выбирают для полного контроля, а Spy — для тестов, где требуется сочетать реальные данные и подменённое поведение
Подробный ответ
Основной ответ
В Mockito есть два распространённых типа тестовых двойников — mock и spy. Они применяются в юнит-тестах для разных задач. Mock представляет собой полностью искусственный объект: его методы по умолчанию ничего не делают, поэтому нужное поведение необходимо задавать вручную. Spy, напротив, создаётся поверх реального объекта и вызывает его настоящие методы, если для конкретного метода не была задана замена.
Ключевые моменты
- Mock: полностью имитирует исходный объект. Пока тестировщик не определит поведение через when(...).thenReturn(...), вызовы его методов возвращают стандартные значения — null, 0 или false. Такой вариант используют, когда зависимость требуется полностью контролировать и не подключать её настоящую реализацию.
- Spy: работает как обёртка над реальным объектом и по умолчанию передаёт вызовы настоящим методам. Одновременно тест может перехватывать отдельные вызовы и задавать для выбранных методов другое поведение. Это позволяет проверять взаимодействие с объектом, сохраняя остальную логику его оригинальной реализации.
- Trade-off: Mock лучше изолирует тестируемый код и обычно проще в настройке, однако его поведение может быть менее реалистичным. Spy предоставляет больше гибкости, но способен сделать тест хрупким, если реальные методы обладают побочными эффектами или зависят от внешних компонентов.
Практический контекст
В прикладных проектах, включая Spring Boot с Mockito 4+, mock часто применяют для репозиториев и сервисов, чтобы полностью отделить тест от их реализации. spy используют, когда в сложном объекте нужно заменить только часть поведения, сохранив остальную логику и реальные side-effects. При этом важно поддерживать чистоту юнит-теста и не создавать чрезмерно глубокие шпионы для сложных объектов.