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

StackOverflow https://stackoverflow.com/questions/22697

  •  09-06-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

Я добился хорошего успеха, используя Мокито.

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

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

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

import static org.mockito.Mockito.*;

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

Это не становится намного проще, чем это.

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

Другие советы

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

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

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

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

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

Я добиваюсь успеха с 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.

Вы также могли бы взглянуть на тестирование с использованием 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, где вам все еще нужно помнить (и проверять), чтобы использовать расширение класса EasyMock.

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

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

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

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

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

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

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

Лучшее решение для издевательства - заставить машину выполнять всю работу с помощью автоматизированного тестирования на основе спецификаций.Для Java смотрите Проверка масштаба и тот Сокращение структура, включенная в Функциональная 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 также предоставляет возможность заглушки методов, сопоставления аргументов (таких как anyInt() и anyString()), проверки количества вызовов (times(3), atLeastOnce(), never())), и многое другое.

Я также обнаружил, что Мокито - это простой и понятный.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top