Spy vs Mock
Загружаем изображение…
Spy vs Mock
Главная разница в том, что mock — это полностью подменённый объект, а spy — это реальный объект, за поведением которого Mockito наблюдает и которое можно частично переопределить.
@Mock
Mockito создаёт полностью искусственный объект:
Методы сами по себе не выполняют реальную логику.
Без when() метод обычно возвращает null, 0, false, пустые значения и т.д.
@Spy
Берётся реальный объект:
Его реальные методы выполняются:
Но конкретный метод можно переопределить:
Теперь calculate() вернёт 100, не выполняя реальную реализацию.
Визуально
Когда использовать?
Mock — основной вариант для unit-тестов:
Spy нужен реже — когда хочется использовать реальную реализацию объекта, но отдельные методы заменить или проверить их вызовы.
И важный момент: @Spy не означает, что Spring Context будет поднят. Mockito работает самостоятельно.
Главная разница в том, что mock — это полностью подменённый объект, а spy — это реальный объект, за поведением которого Mockito наблюдает и которое можно частично переопределить.
@Mock
Mockito создаёт полностью искусственный объект:
@Mock
UserRepository repository;
Методы сами по себе не выполняют реальную логику.
when(repository.findById(1L))
.thenReturn(Optional.of(user));
Без when() метод обычно возвращает null, 0, false, пустые значения и т.д.
@Spy
Берётся реальный объект:
@Spy
UserService service = new UserService(repository);
Его реальные методы выполняются:
service.calculate(); // реальный метод выполнится
Но конкретный метод можно переопределить:
doReturn(100)
.when(service)
.calculate();
Теперь calculate() вернёт 100, не выполняя реальную реализацию.
Визуально
MOCK
┌──────────────┐
│ fake object │
│ │
│ метод → stub │
└──────────────┘
SPY
┌──────────────┐
│ real object │
│ │
│ реальные │
│ методы │
│ ↓ │
│ можно менять │
└──────────────┘
Когда использовать?
Mock — основной вариант для unit-тестов:
Service
↓
Mock Repository
Spy нужен реже — когда хочется использовать реальную реализацию объекта, но отдельные методы заменить или проверить их вызовы.
И важный момент: @Spy не означает, что Spring Context будет поднят. Mockito работает самостоятельно.
Просмотры: 68