Sobes.tech
Junior — Middle

Qual é a diferença entre usar @Spy e @Mock durante os testes?

sobes.tech IA

Resposta da IA

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