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

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

Ответ 1

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

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

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

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

import static org.mockito.Mockito.*;

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

У меня был успех с 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.

Ответ 5

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

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

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

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

Ответ 6

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

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

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

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

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

Ответ 7

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

Ответ 8

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

Ответ 9

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

Ответ 10

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

Ответ 11

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

Ответ 12

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

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

Одна вещь, которая мне не нравится в Mockito, заключается в том, что вы не можете ставить статические методы.

Ответ 13

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

Ответ 14

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