Какая лучшая структура для Java?

Какая лучшая структура для создания mock-объектов в Java? Зачем? Каковы плюсы и минусы каждой структуры?

У меня был хороший успех, используя Mockito .

Когда я попытался узнать о JMock и EasyMock, я обнаружил, что кривая обучения немного крута (хотя, возможно, это только я).

Мне нравится Mockito из-за его простого и чистого синтаксиса, который я смог схватить довольно быстро. Минимальный синтаксис разработан, чтобы поддерживать общие случаи очень хорошо, хотя несколько раз мне нужно было сделать что-то более сложное, я обнаружил, что то, что я хотел, было поддержано и легко понять.

Вот пример (сокращенный) с главной страницы Mockito:

import static org.mockito.Mockito.*; List mockedList = mock(List.class); mockedList.clear(); verify(mockedList).clear(); 

Это не намного проще.

Единственным серьезным недостатком, о котором я могу думать, является то, что он не будет издеваться над статическими методами.

Я создатель PowerMock, поэтому, очевидно, я должен это рекомендовать! 🙂

PowerMock расширяет и EasyMock, и Mockito с возможностью издеваться над статическими методами , окончательными и даже частными методами. Поддержка EasyMock завершена, но плагин Mockito нуждается в дополнительной работе. Мы также планируем добавить поддержку JMock.

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

Сайт проекта JMockit содержит множество сравнительной информации для текущих издевательских наборов инструментов.

В частности, проверьте матрицу сравнения функций , которая охватывает EasyMock, jMock, Mockito, Unitils Mock, PowerMock и, конечно же, JMockit. Я стараюсь держать его точным и современным, насколько это возможно.

У меня был успех с JMockit .

Это довольно ново, и поэтому это немного грубо и недостаточно документально. Он использует ASM для динамического переопределения байт-кода classа, поэтому он может издеваться над всеми методами, включая статические, частные, конструкторы и статические инициализаторы. Например:

 import mockit.Mockit; ... Mockit.redefineMethods(MyClassWithStaticInit.class, MyReplacementClass.class); ... class MyReplacementClass { public void $init() {...} // replace default constructor public static void $clinit{...} // replace static initializer public static void myStatic{...} // replace static method // etc... } 

В нем есть интерфейс ожиданий, позволяющий записывать и записывать сценарии:

 import mockit.Expectations; import org.testng.annotations.Test; public class ExpecationsTest { private MyClass obj; @Test public void testFoo() { new Expectations(true) { MyClass c; { obj = c; invokeReturning(c.getFoo("foo", false), "bas"); } }; assert "bas".equals(obj.getFoo("foo", false)); Expectations.assertSatisfied(); } public static class MyClass { public String getFoo(String str, boolean bool) { if (bool) { return "foo"; } else { return "bar"; } } } } 

Недостатком является то, что для него требуется Java 5/6.

Вы также можете посмотреть тестирование с помощью Groovy. В Groovy вы можете легко высмеять интерфейсы Java, используя оператор «as»:

 def request = [isUserInRole: { roleName -> roleName == "testRole"}] as HttpServletRequest 

Помимо этой базовой функции Groovy предлагает намного больше на издевательском фронте, включая мощные MockFor и StubFor .

http://docs.codehaus.org/display/GROOVY/Groovy+Mocks

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

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

Недавно я быстро взглянул на JMockit , и хотя список функций стилей довольно комплексный, я думаю, что цена на это – parsingчивость полученного кода и необходимость писать больше.

Для меня Мокито попадает в сладкое место, будучи легким для записи и чтения, и имеет дело с большинством ситуаций, которые потребуются большинству кода. Использование Mockito с PowerMock было бы моим выбором.

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

Мы активно используем расширения EasyMock и EasyMock Class Extension на работе и очень довольны этим. Это в основном дает вам все, что вам нужно. Взгляните на документацию, есть очень хороший пример, который показывает вам все возможности EasyMock.

Раньше я использовал JMock. Я пробовал Mockito в своем последнем проекте и мне понравилось. Более кратким, более чистым. PowerMock покрывает все потребности, отсутствующие в Mockito, такие как издевательствование статического кода, издевка над созданием экземпляра, высмеивание окончательных classов и методов. Поэтому у меня есть все, что нужно для выполнения моей работы.

Мне нравится JMock, потому что вы можете установить ожидания. Это полностью отличается от проверки того, был ли метод вызван найденным в некоторых макетных библиотеках. Используя JMock, вы можете написать очень сложные ожидания. См. Jmock cheat-sheat .

Да, Mockito – отличная каркас. Я использую его вместе с hamcrest и Google guice для настройки моих тестов.

Лучшим решением для насмешек является то, чтобы машина выполняла всю работу с автоматическим тестированием на основе спецификации. Для Java см. ScalaCheck и инфраструктуру Reductio, включенную в функциональную библиотеку Java . С автоматизированными основами тестирования на основе спецификации вы предоставляете спецификацию тестируемого метода (свойство, которое должно быть истинным), и среда автоматически генерирует тесты, а также макеты.

Например, следующее свойство проверяет метод Math.sqrt, чтобы увидеть, равен ли квадратный корень любого положительного числа n, равному n.

 val propSqrt = forAll { (n: Int) => (n >= 0) ==> scala.Math.sqrt(n*n) == n } 

Когда вы вызываете propSqrt.check() , ScalaCheck генерирует сотни целых чисел и проверяет ваше свойство для каждого, а также автоматически проверяя, что краевые случаи хорошо покрыты.

Несмотря на то, что ScalaCheck написан на Scala и требует компилятора Scala, с ним легко проверить код Java. Структура Reductio в функциональной Java – это чистая реализация Java из тех же понятий.

Mockito также предоставляет возможность методов stubbing, сопоставляя аргументы (например anyInt () и anyString ()), проверяя количество invocations (times (3), atLeastOnce (), never ()) и т . Д.

Я также обнаружил, что Мокито прост и чист .

Единственное, что мне не нравится в Mockito, это то, что вы не можете ставить статические методы .

Для чего-то немного другого, вы можете использовать JRuby и Mocha, которые объединены в JtestR для написания тестов для вашего Java-кода в выразительном и сжатом Ruby. В JtestR есть несколько полезных издевательских примеров. Одно из преимуществ такого подхода заключается в том, что издевательские конкретные classы очень просты.

Я начал использовать mocks через JMock, но в итоге перешел на использование EasyMock. EasyMock был именно таким, – более простым – и обеспечивал синтаксис, который казался более естественным. С тех пор я не переключился.

  • Спекуляция для JUnit XML Output
  • ASP.NET MVC: Контроллеры модhive тестирования, использующие UrlHelper
  • Единичное тестирование частных методов в C #
  • Настройка IntelliJ IDEA для модульного тестирования с помощью JUnit
  • Запуск PostgreSQL только в памяти
  • Как проверить статическую функцию
  • Как проверить частную функцию или class с частными методами, полями или внутренними classами?
  • Как использовать ArgumentCaptor для stubbing?
  • Mocking EF DbContext с Moq
  • Mock HttpContext.Current в методе тестирования Init
  • Группировка тестов JUnit
  • Давайте будем гением компьютера.