Sobes.tech
Back to questions
Junior — Middle
49

Чем отличается использование @Spy от @Mock при тестировании?

Companies where asked
СБЕРСБЕР
IT OneIT One
Ifellow

Answer from AI

sobes.tech AI

@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 — реальный объект с возможностью подмены отдельных методов.