Какой фреймворк лучше всего подходит для создания 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 также содержит другие полезные функции, такие как подавление статических инициализаторов]3 и конструкторов.
В <а href="и http://jmockit.org">сайт проекта JMockit</а> содержит много сравнительной информации за текущий издевательские пособия.
В частности, проверить в<а href="и http://jmockit.org/MockingToolkitComparisonMatrix.html">характеристика сравнительная матрица</а>, которая охватывает EasyMock, jMock, Mockito, Unitils макет, PowerMock, JMockit и конечно. Я стараюсь, чтобы она была точной и актуальной, насколько это возможно.
Я'вэ был успех с JMockit.
Это'ы довольно новая, и поэтому он'немного сырые и недостаточно документированы. Он использует АСМ динамически переопределить байт-код класса, поэтому он может эмулировать все методы, включая статические, частная, конструкторы и статические инициализаторы. Например:
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-интерфейсов с помощью 'а' оператор:
def request = [isUserInRole: { roleName -> roleName == "testRole"}] as HttpServletRequest
Помимо этой основной функции Заводной предлагает намного больше на насмешливый фронта, в том числе мощные MockFor
и StubFor
классов.
http://docs.codehaus.org/display/GROOVY/Groovy+глумится
Я начал использовать глумится с EasyMock. Достаточно легко понять, но повторить шаг был немного раздражает. Mockito удаляет это, также имеет четкий синтаксис, как это выглядит читаемость была одной из ее главных целей. Я не могу подчеркнуть достаточно, насколько это важно, так как большинство разработчиков будет тратить время на чтение и поддержание существующего кода, а не создавать его.
Еще один приятный момент заключается в том, что интерфейсы и классы реализации обрабатываются точно так же, в отличие от EasyMock, где еще нужно помнить (и проверить) использовать расширение класса EasyMock.
Я'ве принято недавно быстрый взгляд на JMockit, и в то время как перечень услуг довольно всеобъемлющий, я думаю, что цена этого является четкость результирующего кода, и того, чтобы больше писать.
Для меня, Mockito хитов сладкое пятно, что легко писать и читать, и дело с большинством ситуаций большинство код потребуется. Используя Mockito с PowerMock будет мой выбор.
Одна вещь, чтобы рассмотреть, что инструмент, который вы выбрали бы, если вы занимались сами, или в небольшой дружной команде, не может быть лучшим, чтобы сделать для большой компании с разработчиками разного уровня мастерства. Удобочитаемость, легкость и простота использования потребуется больше внимания в последнем случае. Нет смысла в получении конечной насмешливый рамок, если много людей в конечном итоге не используя его или не поддерживать тестов.
Мы активно используем EasyMock и EasyMock Class Extension на работе и очень довольны этим. По сути, он дает вам все, что вам нужно. Посмотрите документацию, там есть очень хороший пример, который показывает все возможности EasyMock.
Я JMock рано. Я'вэ пытался Mockito на мой последний проект и понравился. Более сжатое, более чище. PowerMock охватывает все потребности, которые отсутствуют в Mockito, таких как насмешливый статический код, насмешливое создание экземпляра, издеваясь над окончательной классов и методов. Поэтому у меня есть все, что мне нужно выполнять свою работу.
Я как JMock, потому что вы можете настроить ожидания. Это полностью отличается от проверки, если был метод, называемый в некоторых глумиться библиотеки. Используя JMock можно писать очень сложные ожидания. Увидеть jmock чит-сом.
Да, Mockito является прекрасной основой. Я использую его вместе с hamcrest и в Google guice для настройки мои тесты.
Лучшее решение для глумливый, чтобы заставить машину делать все работы с автоматизированными спецификация тестирования. Для Java, см. ScalaCheck и доказательство системой, включенной в функциональный Ява библиотека. С автоматизированной спецификация ориентированного тестирования, мы поставляем спецификация тестируемого метода (свойство такое, что должно быть правдой) и платформа создает тесты, а также макеты объектов, автоматически.
Например, следующее свойство тесты по математике.метода sqrt, чтобы увидеть, если квадратный корень из любого положительного числа N в квадрате равен N.
val propSqrt = forAll { (n: Int) => (n >= 0) ==> scala.Math.sqrt(n*n) == n }
Когда вы называете propSqrt.проверить()`, ScalaCheck генерирует сотни чисел и проверяет свойство для каждого, также автоматически, убедившись, что крайние случаи скрыты.
Хотя ScalaCheck написано в Scala, и требует компилятор Scala, это'ы легко для проверки Java-кода с ним. В доказательство в рамках функциональных Java-это чистый Java-реализации той же концепции.
Mockito также обеспечивает возможность методах заглушки, соответствующие доводы (как anyInt() и anyString()), подтверждающие количество вызовов (раз(3), atLeastOnce(), не()), и.
Я've также обнаружили, что Mockito является простой.
Одна вещь, я не'т, как о Mockito является то, что вы можете'т статическая заглушка методов](http://code.google.com/p/mockito/wiki/FAQ).
Что-то немного другое, вы могли бы использовать последние и мокко, которые объединены в JtestR, чтобы писать тесты для кода Java в выразительное и лаконичное Руби. Есть некоторые полезные насмешливый примеры с JtestR здесь. Одно из преимуществ этого подхода заключается в том, что насмешливый классы бетона очень проста.
Я начал использовать маки через JMock, но в итоге перешел на EasyMock. EasyMock был именно таким - более простым - и обеспечивал синтаксис, который казался более естественным. С тех пор я не менял его.