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

PowerMock + Mockito VS Mockito

Может кто-нибудь подвести итог, какие именно функции дают вам добавить PowerMock поверх Mockito?

До сих пор я нашел их:

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

Добавляет ли что-нибудь еще? Не могли бы вы рассказать в нескольких строках?

И нужно ли жертвовать чем-то при использовании PowerMock?

4b9b3361

Ответ 1

Я не знаю других преимуществ, но я хочу обратиться к двум вашим дополнительным вопросам (и это слишком долго для комментария):

позволяют насмехаться без инъекции зависимостей - мне это не ясно. Вы можете уточнить?

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

public class MyClass {
     public void doGetString() {
         ...
         OtherClass.getString(); //It complex and scary and needs mocking!
         ...
     }
}

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

public class MyClass {
     public static class StringGetter {
         public getString() {
             return OtherClass.getString();                 
         }
     }

     private final StringGetter getter;

     //Existing Constructor
     public MyClass() {
         this(new StringGetter());
     }

     //DI Constructor
     MyClass(StringGetter getter) {
         this.getter = getter;
     }

     public void doGetString() {
         ...
         getter.getString();
         ...
     }
}

Я отделил поведение моего метода от поведения статического вызова и могу использовать конструктор DI, чтобы легко вводить макеты во время тестирования. Конечно, с помощью powermock я мог просто издеваться над статическим методом и работать с ним.

И нужно ли жертвовать чем-то при использовании PowerMock?

Физически нет, но я бы сказал философски да:). Ниже приводятся мои мнения, и я стараюсь дать им веские причины, но, конечно, они мнения, поэтому возьмите их с солью:

Потенциально страшная вещь, которая случается с PowerMock, заключается в том, что для достижения подвигов насмешливых частных и статических методов они используют пользовательский загрузчик классов (который не должен присутствовать во время выполнения в процессе производства) и изменение байт-кода ваших классов. По-видимому, это не должно иметь большого значения с большинством классов в большинстве случаев, но если вы подумаете об этом, если байт-код изменился, а некоторые побочные эффекты больше не присутствуют, вы эффективно тестируете различные классы albiet на основе ваших существующих классов. Да, это очень академический аргумент.

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

Другим аргументом, который я имею против PowerMock, является то, что он почти легко может стать костылем. Я согласен с тем, что PowerMock может помочь с тестированием кода, который использует устаревший код и другой код, который у вас отсутствует. Однако я бы сказал, что, когда вы контролируете классы, которые вам нужно высмеять, вы должны избегать его использования. Если вы пишете класс с помощью частного метода или статического метода, который вам нужно явно высмеять, чтобы проверить другие методы, мой инстинкт кишки сказал бы, что этот метод может делать слишком много и должен быть реорганизован и разбит. Если PowerMock уже доступен в проекте, у вас может возникнуть соблазн просто издеваться над ним и двигаться дальше, что уменьшит боль, которая должна побудить вас реорганизовать то же самое. Да, иногда из-за различных технических и нетехнических ограничений это невозможно, но полезно решить боковые точки, а не избегать их:)

Ответ 2

Еще одна особенность расширения Powermock mockito заключается в том, что он поддерживает насмешливость и опускание равных и хэш-код.

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

Ответ 3

PowerMock - это расширение для Mockito, которое позволяет издеваться над статическими методами, конструкторами, конечными классами и методами, частными методами, удалением статических инициализаторов и т.д.

Ответ 4

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

Ответ 5

Для насмешки над финальным классом мы можем использовать org.mockito.plugins.MockMaker. Что вам нужно сделать, это

  1. Создайте папку в своей папке test/resource с именем mockito-extensions.
  2. Создайте под ним файл с именем org.mockito.plugins.MockMaker.
  3. В этом файле всего одна строчка mock-maker-inline

Это не потребует от вас добавления какой-либо новой библиотеки и, следовательно, сохранения некоторого времени выполнения.