Сравнение между Mockito vs Jmockit - почему Mockito проголосовал лучше, чем jmockit? [закрыто

StackOverflow https://stackoverflow.com/questions/4105592

Вопрос

Я изучаю, какую насмешливую структуру использовать для моего проекта, и сузил его до Jmockit. и Mockito.

Я замечаю это Mockito был признан "Лучший макет для Java"На Stackoverflow.
В сравнении функций на Jmockit."Матрица сравнения издевательства инструмента" кажется, что Jmockit. имеет несколько разных функций.

У кого -нибудь есть какая -то конкретная информация (не мнения) о том, что Mockito может сделать, что не может быть достигнуто с помощью Jmockit. и наоборот?

Это было полезно?

Решение

Обновление сентября 2019: Единственный Поддерживаемая структура издевательства (по умолчанию) под весенним загрузкой является Mockito. Отказ Если вы используете весну, ответ совершенно очевиден.


Я бы сказал, что конкуренция между Jmockit и Powermock., потом Mockito.

Я бы оставил «простой» Jmock и EasyMock, потому что они используют только прокси и CGLIB и не используют инструменты Java 5, как новые рамки.

Jmock также не было стабильного выпуска более 4 лет. jmock 2.6.0 Требуется 2 года, чтобы перейти от RC1 до RC2, а затем еще за 2 года до того, как он на самом деле освобожден.

Относительно прокси и CGLIB против инструментов:

(Easymock and Jmock) основаны на java.lang.reflect.proxy, который требует реализованного интерфейса. Кроме того, они поддерживают создание объектов MOCK для классов через поколение подкласса CGLIB. Из-за этого указанные классы не могут быть окончательными, а только переопределенные методы экземпляра могут быть издеваются. Однако главное, однако, при использовании этих инструментов зависит зависимости зависит зависит зависимости зависит зависимости зависит зависит зависимости объектов других классов, на которых зависит данный класс в соответствии с тестами). из этих зависимостей. Следовательно, зависимости не могут быть просто созданы с новым оператором в классе клиента, для которого мы хотим написать тесты подразделения.

В конечном итоге технические ограничения обычных издевающихся инструментов навязывают следующие ограничения дизайна на производственный код:

  1. Каждый класс, который может потребоваться издеваться в тесте, должен либо реализовать отдельный интерфейс, либо не быть окончательным.
  2. Зависимости каждого класса, подлежащего тестированию, должны быть получены либо с помощью настраиваемых методов создания экземпляра (фабрики или локатор сервиса), либо быть подвергнутыми воздействию впрыскивания зависимостей. В противном случае модульные тесты не смогут передать макетные реализации зависимостей в тестируемое устройство.
  3. Поскольку только методы экземпляра могут быть издеваться, классы, которые будут тестированы единиц, не могут вызвать какие-либо статические методы на их зависимостях, и не создать их, используя любые из конструкторов.

Выше http://jmockit.org/about.html. Отказ Кроме того, он сравнивается между собой (Jmockit), PowerMock и Mockito несколькими способами:

В настоящее время существуют другие насмешливые инструменты для Java, которые также преодолевают ограничения обычных, между ними PowerMock, Jeasytest и Mockinject. Тот, который приближается к набору функций Jmockit, является PowerMock, поэтому я кратко оценлю его здесь (кроме того, два других более ограничены и, похоже, больше не развиваются).

Jmockit vs PowerMock

  • Прежде всего, PowerMock не предоставляет полный API для издевания, но вместо этого работает как расширение другому инструменту, который в настоящее время может быть Easmock или Mockito. Это, очевидно, является преимуществом для существующих пользователей этих инструментов.
  • Jmockit, с другой стороны, предоставляет совершенно новые API, хотя его основной API (ожидания) похож как на EasyMock, так и Jmock. Хотя это создает более длинную кривую обучения, это также позволяет Jmockit обеспечить более простую, более последовательную и проще в использовании API.
  • По сравнению с API API Jmockit ожидания, API PowerMock более «низкоуровневый», заставляя пользователей выяснить и указать, какие классы должны быть готовы для тестирования (с аннотацией @preparefortest ({classa.class, ...}) ) и требуют конкретных вызовов API для работы с различными видами языковых конструкций, которые могут присутствовать в производственном коде: статические методы (Mockstatic (classa.class)), конструкторы (подавление (конструктор (classxyz.class))), вызов конструкторов (Suppress (Constructor (classxyz.class))), вызов конструкторов (Suppress (Constructor (classxyz.class))), конструктор wesenew (aclass.class)), частичные макет (CreatePartialMock (classx.class, "methodTomock") и т. Д.
  • С jmockit ожидания, все виды методов и конструкторов издеваются в чисто декларативный способ, с частичным издевательством, указанным в регулярных выражениях в аннотации @mocked или просто «несемя» членов без зарегистрированных ожиданий; То есть, разработчик просто объявляет некоторых общих «полей издевательства» для тестового класса, или некоторые «локальные поставки для макиянов» и / или «параметры издевательства» для индивидуальных методов испытаний (и в этом последнем случае аннотация @mocked часто не будет быть нужным).
  • Некоторые возможности доступны в JMockit, такие как поддержка издевательства равных и Hashcode, переопределенные методы и другие, в настоящее время не поддерживаются в PowerMock. Кроме того, не существует эквивалента возможности Jmockit, возможностей улавливания экземпляров и реализаций издевательства указанных основных типов в качестве теста, без самого тестового кода, имеющего какое-либо знание фактических классов реализации.
  • PowerMock использует пользовательские загрузки классов (обычно один на тестовый класс), чтобы создать модифицированные версии высмеиваемых классов. Такое тяжелое использование пользовательских загрузчиков класса может привести к конфликтам со сторонними библиотеками, поэтому иногда необходимо использовать аннотацию @powermockignore ("package.to.be.ignored") на тестовых классах.
  • Механизм, используемый JMockit (приборы времени выполнения через «java Agent»), проще и безопаснее, хотя он требует передачи параметра «-Javaagent» для JVM при разработке на JDK 1.5; На JDK 1.6+ (который всегда можно использовать для разработки, даже если развертывание на более старой версии) нет такого требования, поскольку jmockit может прозрачно загружать агент Java по запросу, используя API-API.

Другим недавним издевающимся инструментом является Mockito. Хотя он не пытается преодолеть ограничения старых инструментов (Jmock, Easmock), он вносит новый стиль тестирования поведения с помощью издевателей. Jmockit также поддерживает этот альтернативный стиль через API проверки.

Jmockit vs mockito.

  • Mockito полагается на явные вызовы на его API, чтобы отделить код между записью (когда (...)) и проверить (проверять (...)) фазы. Это означает, что любой вызов на объект MOCK в тестовом коде также потребует вызов для Mocking API. Кроме того, это часто приведет к повторению, когда (...) и проверки (издевательства) ... звонки.
  • С Jmockit не существует подобных вызовов. Конечно, у нас есть новые конструкторы Nonstrictexpectations () и новые проверки () конструкторы, но они встречаются только один раз на тест (обычно) и полностью отделены от призывов к измеченным методам и конструкторам.
  • Mockito API содержит несколько несоответствий в синтаксисе, используемой для вызовов для издеватых методов. На этапе записи у нас есть такие звонки, как (Mock.mockedmethod (args)) ... в то же время в этапе проверки, этот же вызов будет записан как проверки (издевательства) .mockedmethod (args). Обратите внимание, что в первом случае вызов mockedmethod выполнен непосредственно на объекте Mock, в то время как во втором случае он сделан на объекте, возвращаемом проверкой (издевателя).
  • У jmockit нет таких несоответствий, потому что вызовы для издеватых методов всегда делаются непосредственно на самих издевателей. (Только с одним исключением: для сопоставления вызовов в том же издеващемся экземпляре используется, используемый сигнал навязки (издевательства), что приводит к тому, что код, такой как навигация (издевательства). MockedMethod (ARGS); большинство тестов не нужно использовать это, хотя. Несомненно
  • Так же, как и другие насмешливые инструменты, которые основаны на цепочке методов/упаковке, Mockito также сталкивается с непоследовательным синтаксисом при загрязнянии пустого методов. Например, вы пишете, когда (MockedList.get (1)). Thenthrow (new Runtimeexception ()); для невоидного метода и Dothrow (new Runtimeexception ()). Когда (MockedList) .clear (); для пустого. С Jmockit это всегда один и тот же синтаксис: MockedList.clear (); result = new Runtimeexception ();.
  • Еще одна несоответствие возникает в использовании шпионов Mockito: «издеватели», которые позволяют выполнять реальные методы для выполнения на скрытом экземпляре. Например, если SPY относится к пустому списку, то вместо записи, когда (Spy.get (0)). Затемreturn («foo») вам нужно будет написать Doreturn («Foo»). Когда (SPY). 0). С jmockit функция динамической издевательства обеспечивает аналогичную функциональность шпионам, но без этой проблемы, поскольку реальные методы выполняются только во время фазы воспроизведения.
  • В Easmock и Jmock первые издевалкими API для Java сосредоточены в центре внимания на запись ожидаемых вызовов издеватых методов для объектов MOCK, которые (по умолчанию) не позволяют неожиданным вызовам. Эти API также обеспечивают запись разрешенных вызовов для объектов Mock, которые позволяют неожиданным вызовам, но это рассматривается как функция второго класса. Кроме того, с этими инструментами нет способа явную проверку вызовов для издеваний после того, как выполняется тестирование кода. Все такие проверки выполняются неявно и автоматически.
  • В Mockito (а также в Unitils Mock) используется противоположная точка зрения. Все призывы к издевательным объектам, которые могут произойти во время теста, независимо от того, записаны или нет, разрешены, никогда не ожидали. Проверка выполняется явно после использования тестирования кода, никогда не будет автоматически.
  • Оба подхода слишком экстремальны и, следовательно, менее чем оптимальный. Jmockit ожидания и проверки являются единственным API, который позволяет разработчику легко выбирать наилучшую комбинацию строгих (ожидаемого по умолчанию) и нетронутых (разрешенных по умолчанию) призывных к каждому тесту.
  • Быть более четким, Mockito API имеет следующий недостаток. Если вам необходимо проверить, что во время теста произошла выговор на непустовый метод, который произошел в тесте, но тест требует возвращаемого значения из этого метода, отличающегося от по умолчанию для типа возврата, то тест Mockito будет иметь дубликат код: A Когда (Mock.someMethod ()). Затем вызов Thenreturn (XYZ) в этапе записи и проверки (издевательства) .somemethod () в этапе проверки. С jmockit всегда может быть записано строгие ожидания, что не придется быть явно проверенным. Альтернативно, ограничение подсчета вызова (Times = 1) может быть указано для любых зарегистрированных не строгого ожидания (с помощью таких ограничений Mockito можно указать только в вызове Verify (Mock, Connect)).
  • Mockito имеет плохой синтаксис для проверки по порядку, а для полных проверок (то есть проверка того, что все вызовы на объекты MOCK явно проверены). В первом случае необходимо создать дополнительный объект, и вызовы для проверки сделаны на нем: Interorder Onlorder = Interorder (Mock1, Mock2, ...). Во втором случае требуется называет, такие как VerifyNomoreInterIctions (MOCK) или Verifyzerinterations (MOCK1, MOCK2).
  • С Jmockit вы просто пишете новые проверки inordorder () или новые Fullverifications () вместо новых проверок () (или новых полных полных данных () для объединения обоих требований). Нет необходимости указывать, какие издевательские объекты задействованы. Нет дополнительных издевательства от API. И в качестве бонуса, вызывая UnVerifiedInvocations () внутри упорядоченного блока проверки, вы можете выполнить проверку, связанные с порядком, которые просто невозможны в Mockito.

Наконец, Toolkit Jmockit Testing Toolkit имеет более широкий спектр и более амбициозные цели чем другие насмешливые наборы инструментов, чтобы обеспечить полное и сложное решение для тестирования разработчиков. Хорошего API для насмешки, даже без искусственных ограничений, недостаточно для продуктивного создания тестов. Идеагностический, простой, простой в использовании и хорошо интегрированный инструмент покрытия кода также имеет важное значение, и именно это стремится предоставить Jmockit Opporate. Еще одна часть набора инструментов для тестирования разработчика, которая станет более полезной по мере роста тестового набора, - это возможность постепенно повторять тесты после локализованного изменения в производственном коде; Это также включено в инструмент покрытия.

(предоставлено, источник может быть предвзятым, но хорошо ...)

Я бы сказал Jmockit. Отказ Это самый простой для использования, гибкий и работает практически для всех случаев даже сложных и сценариев, когда вы не можете контролировать тестирование класса (или вы не можете сломать его по причинам совместимости и т. Д.).

Мой опыт с jmockit был очень положительным.

Другие советы

Я работал как с Mockito, так и Jmockit, и мой опыт с ними есть:

  • Mockito:

    • Неявный издевательство (-> лучшая удобство использования, но имеет опасность неспособности обнаружить не допустимое метод вызовов на макетах)
    • Явная проверка
  • Eistymock:

    • объяснение издевался
    • неявная проверка
  • Jmockit:

    • поддерживает оба
  • Кроме того, другие преимущества Jmockit:

    • Если вы издеваетесь на статические методы / конструкторы и т. д. (например, расширение очень старого устаревшего кодового кодового базы без UT), у вас будет два варианта: 1) Mockito / Easmock с расширением PowerMock или 2) jmockit
    • Встроенный отчет о покрытии

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

Я использую jmockit Только Из-за нее библиотеки отражения в deencapsultation.class. Я на самом деле люблю стиль Mockito, но я отказываюсь изменить свой код и запутать мою API, так что ограниченная структура тестирования может получить на нем. И я фанат тестирования всего моего кода, поэтому рамки, которые не могут легко проверить частные методы, не то, что я хочу использовать.

Я был раскачен Эта статья

После (по общему признанию большой) кривой обучения Jmockit теперь является моей основной структурой тестирования подразделений для издевателей.

Для легкого тестирования нашей устаревшей кодовой базы (с множеством статических вызовов метода и т. Д.), Jmockit был неоценимы. [Бесстыдная вилка для статья в моем блоге

Я лично предпочитаю EasyMock.
Способность отвлечься между хорошим, нормальным и строгим насмешением управления - это одна из моих любимых.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top