Настройка Powemockito для статического издевательств
Я хотел бы использовать Powermock с Mockito, чтобы высмеивать некоторые вызовы статических методов. Я следил за инструкциями и примерами из SO, а также с PowerMock Начало работы и MockStatic страниц Я могу, но еще не закончен вызов mockStatic().
Когда я вызываю mockStatic (foo.class) из моего тестового класса, мне предоставляется исключение:
java.lang.NoClassDefFoundError: org/Mockito/mock/MockName
at org.powermock.api.mockito.PowerMockito.mockStatic(PowerMockito.java:70)
at ...my test class method call...
Я уверен, что это проблема с настройкой, так как я нашел терминологию, используемую для настройки этого, чтобы быть довольно запутанным. Я захватил Mockito Zip из PowerMock downloads. В Eclipse (3.5.2) я открыл свойства проекта и добавил все Jars в путь сборки. Я также попробовал добавить всю распакованную папку powermockito в мою среду классов vars classpath, а затем просто фильтр powermockito специально, когда это не сработало.
У меня есть эти аннотации на уровне класса моего тестового класса, в соответствии с инструкциями powermock:
@RunWith(PowerMockRunner.class)
@PrepareForTest(ApplicationContextLoader.class)
Кроме того, эти импортные данные, специфичные для производства:
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
Для тех из вас, кто раньше использовал PowerMockito, даже просто указатель в правильном направлении или что-то, что нужно проверить, было бы действительно полезно. Я изо всех сил пытаюсь понять, как моя настройка отличается от той, которую я видел, - из того, что я могу сказать, - того же синтаксиса.
Ответы
Ответ 1
Возможно, версии Powermock и Mockito несовместимы. Исправьте это, и это больше не будет проблемой.
Mockito PowerMock
1.10.8+ 1.6.2+
1.9.5-rc1 - 1.9.5 1.5.0 - 1.5.6
1.9.0-rc1 & 1.9.0 1.4.10 - 1.4.12
1.8.5 1.3.9 to 1.4.9
1.8.4 1.3.7 & 1.3.8
1.8.3 1.3.6
1.8.1 & 1.8.2 1.3.5
1.8 1.3
1.7 1.2.5
Смотрите: https://github.com/powermock/powermock/wiki/Mockito#supported-versions
Ответ 2
Если вы используете статический макет объекта, в аннотации PrepareForTest
добавьте класс, который использует статический объект в дополнение к самому статическому классу. Если класс, который вы тестируете, должен использовать этот статический, добавьте текущий класс в аннотацию. Вы на самом деле не издеваетесь над классом, но он должен быть в аннотации для статического подключения. Это звучит странно, но оно работает.
При добавлении нескольких классов в аннотацию вы можете иметь их внутри {}
и разделять запятыми. Например, если ваш статический класс StaticA.class
, а класс с использованием static - это CallerOfStatic.class
, вы можете использовать:
@RunWith(PowerMockRunner.class)
@PrepareForTest({StaticA.class, CallerOfStatic.class})
Ответ 3
Убедитесь, что версии powermockito и mockito выровнены так, как показано в этой таблице - https://github.com/powermock/powermock/wiki/Mockito#supported-versions,
Простой способ найти это,
mvn dependency:tree | grep mockito
[INFO] | \- org.mockito:mockito-core:jar:1.8.5:compile
[INFO] +- org.mockito:mockito-all:jar:1.9.5:compile
[INFO] +- org.powermock:powermock-api-mockito:jar:1.5.6:compile
В моем случае powermock 1.5.6
и mockito 1.9.5
были выровнены, но пришлось перейти на использование mockito 1.8.5
, так как кто-то еще в зависимости уже использовал mockito 1.8.5.
Следующая комбинация отлично работает для меня,
mvn dependency:tree | grep mockito
[INFO] | \- org.mockito:mockito-core:jar:1.8.5:compile
[INFO] +- org.mockito:mockito-all:jar:1.8.5:compile
[INFO] +- org.powermock:powermock-api-mockito:jar:1.4.9:compile