@Mock создаёт полностью имитированный объект, у которого все методы по умолчанию ничего не делают или возвращают значения по умолчанию. Это полезно, когда нужно изолировать тестируемый класс от зависимостей.
Чем отличается использование @Spy от @Mock при тестировании?
@Mock создаёт полностью имитированный объект, у которого все методы по умолчанию ничего не делают или возвращают значения по умолчанию. Это полезно, когда нужно изолировать тестируемый класс от зависимостей.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
@Mock создаёт полностью имитированный объект, у которого все методы по умолчанию ничего не делают или возвращают значения по умолчанию. Это полезно, когда нужно изолировать тестируемый класс от зависимостей.
@Spy создаёт «шпион» на реальном объекте, позволяя вызывать настоящие методы, но при этом можно подменять отдельные методы или проверять вызовы. Это удобно, когда нужно частично использовать реальное поведение, а частично — подменять.
Пример:
List<String> list = new ArrayList<>();
List<String> spyList = Mockito.spy(list);
Mockito.doReturn("mocked").when(spyList).get(0);
System.out.println(spyList.get(0)); // Выведет "mocked"
System.out.println(spyList.size()); // Вызовет реальный метод size()
Таким образом, @Mock — это полностью фейковый объект, @Spy — реальный объект с возможностью подмены отдельных методов.