Настройка 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