Подтвердить что ты не робот

Как работают фальсифицированные фреймворки Java?

Это НЕ вопрос о том, какая из лучших рамок и т.д.

Я никогда не использовал насмешливую структуру, и я немного озадачен этой идеей. Как он знает, как создать макет? Это делается во время выполнения или создает файл? Откуда вы знаете его поведение? И что самое главное - каков рабочий процесс использования такой структуры (что поэтапно для создания теста)?

Может ли кто-нибудь объяснить? Вы можете выбрать любую структуру, которая вам нравится, например, просто скажите, что это такое.

4b9b3361

Ответ 1

Я буду говорить о структуре, которую я использую (jmock), но другие делают что-то очень похожее.

Как он знает, как создать макет объекта?

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

Выполняется ли во время выполнения или генерирует файл?

jMock создает его во время выполнения.

Откуда вы знаете его поведение?

Макетные объекты довольно тупые. Вы указываете поведение, которое вы ожидаете от них.

И самое главное - что такое рабочий процесс использования такой структуры (что шаг за шагом для создания тест).

Одна очень важная вещь, которую должна предоставить инфраструктура, - это способность проверять, что ожидаемое поведение наблюдалось во время выполнения теста.

jmock делает это, введя конкретный тестовый бегун, который проверяет, что все ожидания по всем объявленным макетным объектам после завершения теста. Если что-то не соответствует, генерируется исключение.

Обычно шаблон имеет вид:

  • Получить макет factory (называемый Mockery in jmock) из тонкого воздуха (с конкретным конструктором no-args).
  • Создайте необходимые макетные объекты.
  • Ожидание установки для макетных объектов
  • Вызовите метод, который вы тестируете, передавая mocks вместо реальных объектов
  • Если ваш метод возвращает некоторые значения, проверьте ожидаемое значение с помощью обычных методов assertXXX.

Ответ 2

Издевательская каркас выводит избыточность и шаблон из теста.

Он знает, что нужно создать объект Mock, потому что вы скажете его, конечно (если вы не имели в виду что-то еще с этим вопросом).

"Стандартный" способ создания макетного объекта заключается в использовании/злоупотреблении класса java.lang.reflect.Proxy для создания реализации интерфейса интерфейса. Это делается во время выполнения. Прокси имеет ограничение в том, что он не может проксировать конкретные классы. Чтобы выполнить издевательство над конкретными классами, требуется динамическое создание байт-кода, которое создает подклассы, которые переопределяют реальную реализацию общедоступных методов, в основном, с прокси-сервером (записывать параметры метода и возвращать предварительно определенное значение). Это имеет ограничение в том, что он не может подклассифицировать конечные классы. Для этого у вас есть такие решения, как JDave, который (я считаю, я этого не подтвердил) гадал с загрузчиком классов, чтобы удалить окончательное обозначение класса перед его загрузкой, поэтому класс на самом деле не является окончательным во время выполнения, что касается JVM.

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

Вот реальный пример из проекта, используя JMock с JUnit4. Я добавил комментарии, чтобы объяснить, что происходит.

 @RunWith(JMock.class) //The JMock Runner automatically checks that the expectations of the mock were actually run at the end of the test so that you don't have to do it with a line of code in every test.
public class SecuredPresentationMapTest {

private Mockery context = new JUnit4Mockery(); //A Mockery holds the state about all of the Mocks. The JUnit4Mockery ensures that a failed mock throws the same Error as any other JUnit failure.

@Test
public void testBasicMap() {
    final IPermissionsLookup lookup = context.mock(IPermissionsLookup.class); //Creating a mock for the interface IPermissionsLookup.
    context.checking(new Expectations(){{ //JMock uses some innovative but weird double brace initialization as its standard idom.
        oneOf(lookup).canRead(SecuredEntity.ACCOUNTING_CONTRACT);
            //expect exactly one call to the IPermissionsLookup.canRead method with the the enum of ACCOUNTING_CONTRACT as the value. Failure to call the method at all causes the test to fail.
            will(returnValue(true)); //when the previous method is called correctly, return true;
    }});

    Map<String, Component> map = new SecuredPresentationMap(lookup, SecuredEntity.ACCOUNTING_CONTRACT);
    //This creates the real object under test, but passes a mock lookup rather than the real implementation.
    JLabel value = new JLabel();
    map.put("", value);
    assertThat(((JLabel) map.get("")), is(value)); //This ensures that the Map returns the value placed, which it should based on the fact that the mock returned true to the security check.
  }
}

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

Что тестируется здесь и в другом противоположном тесте, так это то, что в зависимости от того, что говорит интерфейс IPermissionsLookup о безопасности, карта меняет свое поведение на то, что возвращается. Это базовый хороший случай. В другом тесте mock возвращает false и что-то еще ожидается от Карты. Использование mock гарантирует, что карта полагается на метод IPermissionsLookup, чтобы определить положение безопасности и то, что возвращается.

Ответ 3

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

Ответ 4

Я думаю, что документация EasyMock - это способ начать работу. Он содержит множество примеров, которые легко понять.

Ответ 5

EasyMock (http://easymock.org/) - это издевательская библиотека, которую я использовал больше всего. (Есть другие: jMock, Mockito и т.д.)

Большинство из них создают объект во время выполнения, которым вы можете управлять. Основной поток:

  • Создайте макет
  • Укажите, как он должен действовать, сообщая фальшивой структуре, что нужно ожидать. (Это зависит от структуры.)
  • Используйте макет в своем тесте, как если бы это была настоящая вещь
  • Некоторые фреймворки позволяют (или требуют), чтобы вы "проверяли", что макет был использован правильно.