Какой фреймворк для Java лучше всего?

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


person Josh Brown    schedule 22.08.2008    source источник


Ответы (14)


Я добился больших успехов в использовании Mockito.

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

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

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

import static org.mockito.Mockito.*;

List mockedList = mock(List.class);
mockedList.clear();
verify(mockedList).clear();

Нет ничего проще.

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

person Brian Laframboise    schedule 22.08.2008
comment
Красивый. Для статических методов просто объедините Mockito с JMockit, и у вас практически не будет слишком устаревшего класса, который вы могли бы протестировать. - person Epaga; 13.03.2009
comment
Мне нравится, как когда вы пытаетесь сделать что-то, чего не должны (например, создавать встроенные имитации), вы получаете очень четкое объяснение того, что вы сделали не так, в сообщении об исключении. - person ripper234; 27.06.2009
comment
+1 за Мокито. Несмотря на то, что нигде не упоминается, похоже, что он во многом вдохновлен фреймворком Ruby Mocha (что отлично). - person Matthias; 06.02.2010
comment
Единственное, что мне не нравится в mockito, это то, что вы не можете использовать его для Android, кроме того, что это отличный фреймворк. - person MexicanHacker; 19.03.2010
comment
Для меня абсолютно. Я все равно рекомендую безоговорочно. Конечно, если вы найдете другой фреймворк, который лучше соответствует вашим потребностям, упомяните его в другом ответе и посмотрите, какие голоса он получит и какие комментарии получит. - person Brian Laframboise; 02.03.2011
comment
@MexicanHacker, почему вы не могли использовать его для Android? Я использую его прямо сейчас с Robolectric. - person Ilkka; 19.03.2011
comment
@Ilkka Сейчас трудно вспомнить, проблема была в марте 2010 года, на тот момент mockito не мог имитировать финалы, чего вы часто найдете в Dalvik, вот дополнительная информация: sites.google.com/site/androiddevtesting - person MexicanHacker; 22.03.2011
comment
У меня есть опыт работы с EasyMock, и я считаю его довольно простым в использовании ... так что, если mockito проще, я думаю, это ДЕЙСТВИТЕЛЬНО просто и заслуживает попытки. - person Jaime Hablutzel; 25.06.2011
comment
@MexicanHacker, PowerMock расширяет Mockito, чтобы вы могли запускать тесты Android непосредственно на главном ПК. - person Jeff Axelrod; 14.07.2011
comment
Я использую Mockito, и мне это нравится! Также отличная документация (так редко можно найти документацию такого качества, хорошая работа от авторов), которая так важна для нас, чтобы использовать материал без необходимости копаться в коде фреймворка !!! - person Renato; 08.03.2012
comment
Как говорит Ян Кронквист в своем ответе, вы можете использовать PowerMock для расширения Mockito, если вам нужно имитировать статические методы. - person SamStephens; 20.03.2013
comment
@MexicanHacker выглядит так, как будто в последнее время в Mockito была проведена некоторая работа по поддержке Android. Я ничего об этом не знаю, но он упоминается здесь: docs.mockito.googlecode.com/hg/1.9.5/org/mockito/ - person SamStephens; 20.03.2013

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

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

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

person Jan Kronquist    schedule 28.01.2009
comment
Powermock необходим для модульного тестирования приложений Android с использованием встроенной Java на главном ПК (избегая использования медленного эмулятора) - person Jeff Axelrod; 14.07.2011
comment
Проблема только в @Jan заключается в том, что PowerMock несовместим при использовании Robolectric :-( Я хочу сделать @RunWith (PowerMockRunner.class) И @RunWith (RobolectricTestRunner.class) - person Blundell; 22.10.2011
comment
После использования PowerMock в течение последних нескольких месяцев я настоятельно рекомендую его! - person cwash; 03.01.2012
comment
PowerMock действительно потрясающий. Мне очень нравятся статические синглтоны для доступа ко всему, и это дает возможность протестировать. - person Ian Macalinao; 17.03.2012
comment
Предостережение: некоторые вещи, такие как имитация финальных методов, возможны только в Powermock для EasyMock, но не в Mockito. Это немного сбивает с толку, когда вы не используете его так часто. Мне было интересно, почему что-то не работает, но я понял, что это указано только в разделе Easymock документа. - person trafalmadorian; 05.12.2013

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

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

person Rogério    schedule 21.06.2009
comment
Я впечатлен JMockit, у него более крутая кривая обучения, но у него много лет очень хорошая документация, и он может высмеивать все, что угодно. Я начал с Mockito, которому было легко научиться, но я регулярно встречал проблемы, которые не мог решить с его помощью. С другой стороны, я даже представить не могу, что невозможно с JMockit. - person Hontvári Levente; 16.04.2015

Я добился успеха с JMockit.

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

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.

person Kris Pruden    schedule 18.09.2008
comment
да, действительно могу рекомендовать это - person Epaga; 22.10.2008
comment
Просто новость: проект JMockit переехал в code.google.com/p/jmockit. Со времени публикации этой статьи он ОЧЕНЬ эволюционировал (и продолжает развиваться), и теперь имеет обширную документацию. - person Rogério; 27.12.2009
comment
JMockit снова переехал. Теперь он доступен на Github. jmockit.github.io - person Ravi K Thapliyal; 08.02.2015

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

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

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

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

person p3t0r    schedule 18.09.2008

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

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

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

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

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

person trafalmadorian    schedule 18.06.2011
comment
+1 Этот ответ требует больше голосов. Следует рассказать, что им на самом деле понравилось, а что нет в фреймворке. Просто пользовался этим .. и мне понравилось! это одна из причин, почему такие хорошие вопросы закрываются на SO. - person Ravi K Thapliyal; 08.02.2015

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

person dlinsin    schedule 22.08.2008
comment
В своем вопросе я больше искал, что вам нравится и не нравится в фиктивной структуре. Я могу найти документацию и прочитать все об этом - я хочу знать, что люди, которые ее использовали, думают об этом. - person Josh Brown; 08.09.2008
comment
EasyMock работает только на Java 5 и выше, ага! - person matt b; 05.12.2008

Я рано использовал JMock. Я пробовал Mockito на своем последнем проекте, и он мне понравился. Лаконичнее, чище. PowerMock покрывает все потребности, которые отсутствуют в Mockito, такие как имитация статического кода, имитация создания экземпляра, имитация финальных классов и методов. Так что у меня есть все необходимое для работы.

person Dmitry    schedule 09.01.2010

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

person Andrea Francia    schedule 20.12.2008

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

person Bartosz Bierkowski    schedule 31.08.2008

Лучшее решение проблемы имитации - это сделать так, чтобы машина выполняла всю работу с автоматическим тестированием на основе спецификаций. Для 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.

person Apocalisp    schedule 28.01.2009


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

person James Mead    schedule 03.02.2009

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

person Mike Furtak    schedule 26.08.2008