PowermockとMockitoを使用して、静的メソッド呼び出しをモックしたいと思います。 SO、PowerMock Getting Started および 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...
これを設定するために使用される用語がかなり混乱していることがわかっているので、これは設定の問題であると確信しています。 PowerMockからMockitoZipを取得しました ダウンロード 。 Eclipse(3.5.2)で、プロジェクトプロパティを開き、すべてのJarをビルドパスに追加しました。また、解凍したpowermockitoフォルダー全体を環境変数クラスパスに追加してみましたが、それがうまくいかなかった場合は、powermockitojarだけを追加しました。
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を使用したことがある方は、正しい方向へのポインタやチェックするものだけでも非常に役立ちます。私の設定が、同じ構文を使用して見た投稿の設定とどのように異なるかを確認するのに苦労しています。
おそらく、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
静的モックオブジェクトを使用している場合は、PrepareForTest
アノテーションで、静的クラス自体に加えて、静的オブジェクトを使用しているクラスを追加します。テストしているクラスがこの静的を使用する必要がある場合は、現在のクラスをアノテーションに追加します。実際にクラスをモックするわけではありませんが、スタティックをフックするためにアノテーションに含める必要があります。奇妙に聞こえますが、機能します。
アノテーションに複数のクラスを追加する場合は、それらを{}
内に入れ、コンマで区切ることができます。たとえば、静的クラスがStaticA.class
で、静的クラスを使用するクラスがCallerOfStatic.class
の場合、次を使用できます。
@RunWith(PowerMockRunner.class)
@PrepareForTest({StaticA.class, CallerOfStatic.class})
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
とmockito1.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