Я не знаю других преимуществ навскидку, но я хочу ответить на 2 ваших подвопроса (и это слишком долго для комментария):
разрешить насмешку без внедрения зависимостей - мне это не ясно. Можете ли вы уточнить?
Я думаю, что это пришло из вики-страницы Motivation, где они описывают способ рефакторинга кода, чтобы не вызывать статические методы. чтобы сделать его тестируемым. В качестве конкретного примера того, к чему, я думаю, они пришли, допустим, у вас есть этот код, и вы хотите протестировать метод, имитирующий поведение статического метода, без использования powermock:
public class MyClass {
public void doGetString() {
...
OtherClass.getString(); //It's 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, заключается в том, что для того, чтобы совершить подвиги издевательства над частными и статическими методами, они используют собственный загрузчик классов (который не должен присутствовать во время выполнения в рабочей среде) и изменяют байт-код ваших классов. . Возможно, это не должно иметь значения для подавляющего большинства классов большую часть времени, но если вы думаете об этом, если байт-код изменился и некоторые побочные эффекты больше не присутствуют, вы эффективно тестируете разные классы, хотя и основанные на вашем существующие классы. Да, это очень академический аргумент.
Вы можете несколько смягчить этот первый аргумент, имея хорошую всестороннюю интеграцию и тесты более высокого уровня, которые не используют PowerMock. Таким образом, вы можете быть более уверены в поведении своих объектов, даже если ваши модульные тесты используют PowerMock.
Другой аргумент, который у меня есть против PowerMock, заключается в том, что он слишком легко может стать костылем. Я согласен с тем, что PowerMock может помочь с тестированием кода, который использует устаревший код и другой код, который вы не можете контролировать. Однако я бы сказал, что когда у вас есть контроль над классами, которые вам нужно имитировать, вам следует избегать его использования. Если вы пишете класс с закрытым методом или статическим методом, который вам нужно явно имитировать, чтобы протестировать другие методы, мое внутреннее чутье подскажет, что этот метод может делать слишком много и его следует реорганизовать и разбить. Имея PowerMock, уже доступный в проекте, у вас может возникнуть соблазн просто смоделировать его и двигаться дальше, что уменьшит боль, которая должна побудить вас провести рефакторинг того же самого. Да, иногда из-за различных технических и нетехнических ограничений это невозможно, но лучше решать болевые точки, а не избегать их :)
person
Charlie
schedule
17.06.2011