Что такое Object Mocking и когда он мне нужен?

Многие люди используют Mock Objects при написании модульных тестов. Что такое фиктивный объект ? Зачем мне это нужно? Нужна ли мне Mock Object Framework?

7.08.2008 02:37:07
См. Связанный вопрос stackoverflow.com/questions/38181/when-should-i-mock?lq=1
Michael Freidgeim 6.07.2013 01:36:30
9 ОТВЕТОВ
РЕШЕНИЕ

Object Mocking используется, чтобы сохранить зависимости от вашего модульного теста. Иногда у вас будет тест типа «SelectPerson», который выберет человека из базы данных и вернет объект Person.

Для этого обычно требуется зависимость от базы данных, однако с помощью имитации объекта вы можете имитировать взаимодействие с базой данных с помощью фиктивной инфраструктуры, поэтому он может вернуть набор данных, который выглядит как возвращенный из базы данных, и затем вы можете проверить ваш код, чтобы убедиться, что он обрабатывает преобразование набора данных в объект person, а не использует его для проверки существования соединения с базой данных.

35
28.02.2013 21:01:36
Будет ли необходимо издеваться над объектом, когда сам объект можно установить и передать обратно в модульные тесты. По тому сценарию, который предпочтительнее и почему? В моем случае у меня есть функция доменного уровня, которая использует объект DTO. Теперь кажется нелогичным на самом деле писать код с использованием Mockito, а не с помощью операции .set в объекте DTO и использовать ее в модульных тестах. Пример - mockObject.setMessage ("Hello") v / s Mockito.when (mockDTO.getMessage ()). ThenReturn ("Hello"); 10/10 раз я хотел бы пойти на первый подход.
Ashwin 26.10.2015 01:12:25

Это позволяет вам проверить, как одна часть вашего проекта взаимодействует с остальной частью, не создавая целиком и потенциально пропуская важную часть.

РЕДАКТИРОВАТЬ: Отличный пример из Википедии: Это позволяет вам тестировать код заранее, как автомобильный дизайнер использует манекен для краш-теста, чтобы проверить поведение автомобиля во время аварии.

5
7.08.2008 02:38:57

Object Mocking - это способ создания «виртуального» или смоделированного объекта из интерфейса, абстрактного класса или класса с помощью виртуальных методов. Это позволяет вам сортировать один из них в вашем собственном определении для целей тестирования. Это полезно для создания объекта, на который полагается определенный блок кода, который вы тестируете.

Популярный, который мне нравится использовать, называется Moq , но есть много других, таких как RhinoMock, и множество других, о которых я не знаю.

6
7.08.2008 02:40:06

Макет объекта позволяет вам проверять только то, что вы пишете, и абстрактные детали, такие как доступ к ресурсу (диск, сетевая служба и т. Д.). Затем макет позволяет вам притвориться тем внешним ресурсом, или классом, или чем-то еще.

Вам на самом деле не нужна фиктивная объектная среда, просто расширьте класс функциональности, о которой вы не хотите беспокоиться в своем тесте, и убедитесь, что класс, который вы тестируете, может использовать ваш макет вместо реального (передайте его в через конструктор или сеттер или что-то.

Практика покажет, когда издевательства полезны, а когда нет.

РЕДАКТИРОВАТЬ: Мокринг ресурсов особенно важен, поэтому вам не нужно полагаться на их существование во время теста, и вы можете смоделировать детали того, как они существуют и что они отвечают (например, имитация FileNotFoundException или веб-службы, которая отсутствует или различные возможные возвращаемые значения веб-службы) ... все без учета медленного времени доступа (имитация окажется НАМНОГО быстрее, чем доступ к таким ресурсам в тесте).

12
7.08.2008 02:47:28

Другое использование - это позволит вам протестировать другие части вашей системы, которые еще не созданы. Например, если ваш класс зависит от какого-то другого класса, который является частью функции, над которой кто-то еще работает, вы можете просто запросить в основном полный интерфейс, запрограммировать интерфейс и просто смоделировать детали, как вы ожидаете, что они будут работать. Затем убедитесь, что ваши предположения об интерфейсе были правильными (либо во время разработки, либо после завершения функции).

3
7.08.2008 02:45:32

Несколько человек уже ответили «что», но вот несколько быстрых «почему», о которых я могу подумать:

  1. Спектакль

    Поскольку модульные тесты должны быть быстрыми, тестирование компонента, взаимодействующего с сетью, базой данных или другим ресурсоемким ресурсом, не требует оплаты штрафа, если оно выполняется с использованием фиктивных объектов. Экономия складывается быстро.

  2. сотрудничество

    Если вы пишете красиво инкапсулированный кусок кода, который должен взаимодействовать с чужим кодом (который еще не написан или разрабатывается параллельно - общий сценарий), вы можете использовать свой код с фиктивными объектами, как только интерфейс был согласован. В противном случае ваш код может не начать тестирование, пока другой компонент не будет завершен.

17
8.08.2013 14:39:31

Нужна ли мне Mock Object Framework?

Конечно, нет. Иногда писать макеты вручную может быть довольно утомительно. Но для простых вещей это совсем не плохо. Применив принцип Last Responsible Moment к фреймворкам, вы должны переходить от рукописных к фреймворку только тогда, когда вы сами доказали, что рукописные шутки - это больше проблем, чем они того стоят.

Если вы только начинаете с насмешек, прыжок прямо в каркас как минимум удвоит вашу кривую обучения (вы можете удвоить кривую?). Mocking рамка будет делать гораздо больше смысла , когда вы провели несколько проектов , написания издевается вручную.

9
7.08.2008 04:26:18

Пригодится ли вам фальшивый фреймворк, отчасти зависит от языка кода, который вы пишете. Со статическим языком вам нужно приложить дополнительные усилия, чтобы заставить компилятор принять ваши фиктивные объекты в качестве замены реальной вещи. В динамически типизированном языке, таком как Python, Ruby или Javascript, вы обычно можете просто прикрепить методы к произвольному объекту или классу и передать их в качестве параметра - таким образом, инфраструктура добавит гораздо меньше значения.

1
7.08.2008 04:32:44

2 рекомендованных макетных среды для тестирования .net Unit - это Typemock Isolator и Rhino Mock.

В следующей ссылке вы можете увидеть объяснение от Typemock о том, зачем вам нужна фреймворк для модульного тестирования.

0
15.10.2008 14:41:16