Какой лучший макет фреймворка для Java? [закрыто]

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

22.08.2008 15:45:11
14 ОТВЕТОВ
РЕШЕНИЕ

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

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

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

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

import static org.mockito.Mockito.*;

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

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

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

315
13.02.2015 02:33:44
Красивая. Для статических методов просто объедините Mockito с JMockit, и практически нет класса, слишком «унаследованного», чтобы вы могли проводить тестирование.
Epaga 13.03.2009 14:26:20
Мне нравится, что когда вы пытаетесь сделать что-то, чего не должны делать (например, создавать макеты в строке), вы получите очень четкое объяснение того, что вы сделали неправильно в сообщении об исключении.
ripper234 27.06.2009 12:00:34
Для меня абсолютно. Я все еще рекомендовал бы это безоговорочно. Конечно, если вы найдете другую структуру, которая лучше соответствует вашим потребностям, упомяните ее в другом ответе и посмотрите, какие голоса она получает и какие комментарии она получает.
Brian Laframboise 2.03.2011 15:24:55
@MexicanHacker, почему вы не можете использовать его для Android? Я использую это прямо сейчас, с Robolectric.
Ilkka 19.03.2011 18:57:58
Я использую Mockito и люблю его! Отличная документация тоже (так редко можно найти документацию такого качества, хорошая работа от авторов), что так важно для нас, чтобы использовать материал без необходимости копаться в коде фреймворка !!!
Renato 8.03.2012 07:37:05

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

11
22.08.2008 19:42:40
В моем вопросе я больше искал то, что вам нравится и не нравится в фиктивных рамках. Я могу найти документацию и прочитать все об этом - я хочу знать, что думают об этом люди, которые ее использовали.
Josh Brown 7.09.2008 23:44:45
EasyMock работает только на Java 5 и выше, аааа!
matt b 5.12.2008 18:50:17

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

1
26.08.2008 11:35:39

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

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

В Mockito мне не нравится то, что вы не можете заглушить статические методы .

3
23.05.2017 12:18:01
Этот ответ неточный. Вы не ограничены интерфейсами с jMock. Вы можете издеваться над конкретными классами с помощью ClassImposteriser.
Teflon Ted 12.09.2008 02:59:48
С EasyMock вы можете делать то же самое.
Cem Catikkas 14.09.2008 05:27:47
Я удалил неточности из своего ответа.
Josh Brown 11.03.2010 18:48:10

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

5
31.08.2008 18:52:17

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

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

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

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

15
17.05.2013 04:24:20

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

21
23.01.2015 08:54:06
да, могу порекомендовать это
Epaga 22.10.2008 09:49:47
Просто обновление: проект JMockit переехал на code.google.com/p/jmockit . С этого поста оно получило ОЧЕНЬ много (и до сих пор развивается) и теперь имеет обширную документацию.
Rogério 27.12.2009 01:18:45
JMockit снова переехал. Теперь он доступен на Github. jmockit.github.io
Ravi Thapliyal 8.02.2015 14:55:31

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

6
14.07.2011 07:39:01

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

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

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

84
28.01.2009 19:26:26
Powermock необходим для модульного тестирования приложений Android с использованием встроенной Java на главном ПК (избегая использования медленного эмулятора)
Jeff Axelrod 14.07.2011 18:08:20
@Jan единственная проблема в том, что PowerMock несовместим при использовании Robolectric, хотя :-( Я хочу сделать @RunWith (PowerMockRunner.class) И @RunWith (RobolectricTestRunner.class)
Blundell 22.10.2011 00:29:17
После использования PowerMock в течение последних нескольких месяцев я искренне рекомендую его!
cwash 3.01.2012 19:59:52
PowerMock действительно потрясающий. Я действительно люблю статические синглтоны, чтобы получить доступ ко всему, и это позволяет это проверить.
Ian Macalinao 17.03.2012 08:42:41
Предостережение: некоторые вещи, такие как насмешливые финальные методы, возможны только в Powermock для EasyMock, но не для Mockito. Это немного глупо, когда вы не используете его так часто. Мне было интересно, почему что-то не работает, тогда я понял, что это только перечислено в разделе Easymock документа.
trafalmadorian 4.12.2013 23:57:23

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

4
26.11.2013 04:54:18

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

2
3.02.2009 18:44:49

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

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

46
12.09.2014 16:09:32
Я впечатлен JMockit, у него более крутая кривая обучения, но у него очень хорошая документация в течение многих лет, и он может издеваться над чем угодно. Я начал с Mockito, который был легок в освоении, но я регулярно сталкивался с проблемами, которые не мог решить с ним. С другой стороны, я даже не представляю, что невозможно с JMockit.
Hontvári Levente 16.04.2015 15:39:40

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

8
9.01.2010 07:50:46

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

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

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

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

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

13
4.03.2015 14:35:35
+1 За этот ответ нужно больше голосов. Надо делиться тем, что им на самом деле понравилось или нет в рамках. Просто "Я использовал это .. и мне понравилось!" это одна из причин, почему такие хорошие вопросы закрываются на SO.
Ravi Thapliyal 8.02.2015 14:52:16