В фреймворках имитации вы можете имитировать объект или шпионить за ним. В чем разница между ними и когда я должен / должен использовать одно вместо другого?
Глядя на Mockito , например, я вижу, что похожие вещи делаются с использованием шпионов и имитаторов , но я не уверен в различии между ними.
unit-testing
mocking
tdd
Вивин Палиат
источник
источник
Ответы:
Мок-объект полностью заменяет фиктивный класс, возвращая записанные или значения по умолчанию. Вы можете создать макет «из воздуха». Это то, что в основном используется во время модульного тестирования.
При шпионаже вы берете существующий объект и «заменяете» только некоторые методы. Это полезно, когда у вас огромный класс и вы хотите имитировать только определенные методы (частичное имитирование). Позвольте процитировать документацию Mockito :
Если сомневаетесь, используйте моки.
источник
Mockito предупреждает, что частичное издевательство не является хорошей практикой, и вам следует пересмотреть свою объектно-ориентированную архитектуру. Для тестирования устаревшего кода рекомендуется использовать шпион (или частичное издевательство) .
источник
Я попытаюсь объяснить здесь на примере:
Здесь у нас был исходный реальный объект
list
, в который мы добавили один элемент и ожидали, что размер будет единым.Мы шпионим за реальным объектом, что означает, что мы можем указать, какой метод заглушить . Так что мы объявили , что мы погасили метод -
size()
на объекте шпиона , который будет возвращать 10, независимо от того , что фактического размера.В двух словах, вы будете шпионить реальный объект и незавершенные некоторые из методов .
источник
Ссылка: http://javapointers.com/tutorial/difference-between-spy-and-mock-in-mockito/
При использовании фиктивных объектов поведение метода по умолчанию, когда он не заглушен, - ничего не делать. Простое означает, что если это метод void, он ничего не будет делать, когда вы вызываете метод, или если это метод с возвратом, он может вернуть значение null, empty или значение по умолчанию.
Конечно, в объектах-шпионах, поскольку это настоящий метод, когда вы не заглушаете метод, он вызывает реальное поведение метода. Если вы хотите изменить и поиздеваться над методом, вам нужно его заглушить.
источник
Моки - это не заглушки, Мартин Фаулер
источник
У шпионов есть два определения. В первом случае вызывается реальный метод, в другом - не вызываются функциональные возможности и возвращаются только нулевые или нулевые эквивалентные значения, но методы были вызваны, и их состояние было записано, как правило, метод x был вызван y раз.
источник
В Mockito, если вы назначаете какой-либо объект переменной экземпляра Mock Object, это не влияет на Mock Object.
Но в случае Spy, если вы назначите какой-либо объект переменной экземпляра Spy Object, это повлияет на Spy Object, потому что Spy действует как модификация объекта в реальном времени.
Для справочного примера
источник