Разница между Mockito @Spy и @Mock (answer = Answers.CALLS_REAL_METHODS)

В чем разница между этими двумя объявлениями в Mockito?

@Mock(answer = Answers.CALLS_REAL_METHODS)
ArrayList<String> mock;

@Spy
ArrayList<String> spy;

Ответ 1

Предыдущий стиль CALLS_REAL_METHODS создает неинициализированный объект; никакие конструкторы не запускаются и поля не задаются. Как правило, этот синтаксис небезопасен, так как реальные реализации будут взаимодействовать с неинициализированными полями, которые могут составлять недопустимое или невозможное состояние.

Последний стиль @Spy позволяет вам вызвать конструктор по вашему выбору, или Mockito попытается вызвать конструктор no-arg, если поле не инициализировано. Затем поля копируются в сгенерированный Spy (который расширяет тип шпионажа), что позволяет использовать гораздо более безопасные и более реалистичные взаимодействия.


Реквизит напоминание: Не на самом деле дразнить Java коллекции вне игрушечные примеры, и не забудьте использовать doReturn синтаксис при переопределении шпионов и CALLS_REAL_METHOD издевается или иначе вы будете называть реальный метод внутри when это вызов.