2013-09-27 6 views
9

Я хотел бы использовать Powermock с Mockito, чтобы высмеять некоторые вызовы статических методов. Я следил за инструкциями и примерами из SO, а также с PowerMock Getting Started и MockStatic страниц, насколько это возможно, но мне еще предстоит завершить вызов mockStatic().Настройка Powemockito для статического насмешка

Когда я называю mockStatic (Foo.class) из моего тестового класса, я дал excception:

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 специально, когда это не получилось.

У меня есть эти annotationsat класса уровня моего тестового класса, а также, в соответствии с инструкциями powermock:

@RunWith(PowerMockRunner.class) 
@PrepareForTest(ApplicationContextLoader.class) 

Кроме того, этот powermock специфического импорт:

import org.powermock.api.mockito.PowerMockito; 
import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.powermock.modules.junit4.PowerMockRunner; 

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

+0

ли вы когда-нибудь найти решение? – Dave

+0

Не то, чтобы я помню, хотя прошло уже пару лет. У меня есть ответ от @Walls upvoted, так что, должно быть, это была самая большая помощь, кроме решения. – Ubunfu

ответ

3

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

При добавлении нескольких классов в аннотацию вы можете получить их внутри {} и разделены запятыми. Например, если ваш статический класс StaticA.class и класс, используя статику CallerOfStatic.class вы можете использовать:

@RunWith(PowerMockRunner.class) 
@PrepareForTest({StaticA.class, CallerOfStatic.class}) 
+0

Спасибо, я просто попытался, что, заставляя мои аннотации выглядеть следующим образом: '@RunWith (PowerMockRunner.class) @PrepareForTest ({ApplicationContextLoader.class, \t \t TestClass.class}) общественного класса TestClass {..test код класса ...} ' – Ubunfu

+0

@Ubunfu это сработало :) ??? – Walls

+0

Ха-ха, по-видимому, я был слишком занят, пытаясь сделать это читаемым, чтобы сказать эту часть. Но нет, похоже, это не имеет никакого значения. – Ubunfu

24

Вероятно, варианты 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/jayway/powermock/wiki/MockitoUsage

0

Убедитесь, что версии powermockito и Mockito выровненные как в этом графике - https://github.com/jayway/powermock/wiki/MockitoUsage#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 
Смежные вопросы