Spy vs Mock

Загружаем изображение…
Spy vs Mock

Главная разница в том, что 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
Открыть в MAX Сообщить о неточности

Репосты публикации

Публикация канала

Сообщить о неточности

Опишите, что нужно исправить. Если есть источник, добавьте ссылку.

Вы покидаете datool.ru

Ссылка ведёт на внешний сайт. datool.ru не отвечает за его содержимое — проверьте адрес, прежде чем вводить пароли или платёжные данные.

Переход через 10 с

Перейти