PowerMock は、単体テストでモック オブジェクトを作成するために使用されるオープンソースの Java フレームワークです。 EasyMock や Mockito などの他のモック フレームワークを拡張して、機能を強化します。 PowerMock フレームワークは、カスタム クラスローダーとバイトコード操作技術を使用して、静的メソッド、最終クラス、最終メソッド、プライベート メソッド、コンストラクターのモック化、および静的初期化子の削除を可能にします。 PowerMock の主な目的は、いくつかのメソッドとアノテーションを使用して既存の API を拡張し、単体テストを非常に簡単にする追加機能を提供することです。
PowerMock フレームワークは、と呼ばれるクラスを提供します。 パワーモッキト モックオブジェクトを作成し、検証と期待を開始するために使用されます。 PowerMockito は、Java リフレクション API と連携する機能を提供します。
例を使って PowerMock の概念を理解しましょう。
Mockito を使用した PowerMock の例
ここでは、Mockito と JUnit フレームワークを使用して PowerMock の例を作成します。 PowerMock を使用してサンプルを作成するには、次の手順を実行する必要があります。
ステップ1: 次の PowerMock 依存関係を pom.xml ファイルに追加します。
org.powermock powermock-api-mockito 1.7.0 test org.powermock powermock-module-junit4 1.7.0 test
ステップ2: PowerMock アノテーションを適用する
Mockito で PowerMock を使用するには、以下を適用する必要があります 二 テスト内の注釈:
@RunWith(PowerMockRunner.class): これは前の例で使用したものと同じです。唯一の違いは、前の例では MockitoUnitRunner.class を使用しましたが、今回はテストで PowerMockito API を有効にするために PowerMockRunner.class を使用することです。
加算器全加算器
@PrepareForTest: これは、PowerMock にテスト用にいくつかのクラスを準備するように指示します。これは、テスト クラスと個々のテスト メソッドの両方に適用できます。これには、モック化できる、final、static、private、またはネイティブ メソッドを持つクラスが含まれます。
@RunWith(PowerMockRunner.class) @PrepareForTest(Utility.class) public class Powermock_test { }
注: 上記の 2 つの手順は、PowerMock を使用して作成するすべての例で必須です。
Mockito および JUnit フレームワークを使用した PowerMock の例は次のとおりです。
1.あざけり 静的 メソッド
次の例では、モックします。 静的 方法。
ステップ1: を含むクラスを作成します。 静的 方法。という名前のクラスを作成しました ユーティリティ。
ユーティリティ.java
public class Utility { public static String staticMethod(String call) { return call; } }
ステップ2: という名前の JUnit テスト ケースを作成します。 パワーモックテスト、 テスト目的のため。
Powermock_test.java
import static junit.framework.Assert.assertEquals; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; @RunWith(PowerMockRunner.class) @PrepareForTest(Utility.class) public class Powermock_test { @Test public void TestStaticMethod_WithPowerMockito() { String call = ' Hi there, I'm using PowerMock with Mockito '; String callexpectation = ' Call Expectation for you. '; PowerMockito.mockStatic(Utility.class); PowerMockito.when(Utility.staticMethod(call)).thenReturn(callexpectation); String actualcall = Utility.staticMethod(call); assertEquals(callexpectation, actualcall); } }
出力
次の出力は、テストが正常に実行されていることを示しています。
また、次のメソッドを使用して、静的メソッドが呼び出されているかどうかを確認することもできます。 verifyStatic() 以下に示すように、PowerMockito のメソッド。
PowerMockito.verifyStatic(); Utility.staticMethod(call);
2.あざけり プライベート メソッド
次の例では、モックを作成します。 プライベート 方法。
unixのトップコマンド
ステップ1: プライベート メソッドを含むクラスを作成します。という名前のクラスを作成しました ユーティリティ そして、 プライベート メソッドとパブリック メソッド (プライベート メソッドのオブジェクトを返す)。
ユーティリティ.java
public class Utility { private String privateMethod(String message) { return message; } public String callPrivateMethod(String message) { return privateMethod(message); } }
ステップ2: という名前の JUnit テスト ケースを作成します。 PowerMock_test テスト目的のため。
Powermock_test.java
import static junit.framework.Assert.assertEquals; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; @RunWith(PowerMockRunner.class) @PrepareForTest(Utility.class) public class Powermock_test { @Test public void TestPrivateMethod_WithPowerMock() throws Exception { String message = ' PowerMock with Mockito and JUnit '; String expectedmessage = ' Using with EasyMock '; Utility mock =PowerMockito.spy(new Utility()); PowerMockito.doReturn(expectedmessage).when(mock, 'privateMethod', message); String actualmessage = mock.callPrivateMethod(message); assertEquals(expectedmessage, actualmessage); System.out.println(PowerMockito.verifyPrivate(getClass())); } }
出力
次の出力は、テストが正常に実行されていることを示しています。
3. 嘲笑する 最後の メソッド
次の例では、モックします。 最後の 方法。
ステップ1: を含むクラスを作成します。 最後の 方法。 Utility という名前のクラスを作成し、という名前の最終メソッドを定義しました。 最終メソッド。
アンドロイド上のリンゴの絵文字
ユーティリティ.java
public class Utility { public final String finalMethod(String message) { return message; } }
ステップ2: という名前の JUnit テスト ケースを作成します。 パワーモックテスト テスト目的のため。
Powermock_test.java
import static junit.framework.Assert.assertEquals; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mockito; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; @RunWith(PowerMockRunner.class) @PrepareForTest(Utility.class) public class Powermock_test { @Test public void TestFinalMethod_WithPowerMock() throws Exception { String message = ' PowerMock with Mockito and JUnit '; Utility uti = PowerMockito.mock(Utility.class); PowerMockito.whenNew(Utility.class).withNoArguments().thenReturn(uti); Utility uti2 = new Utility(); PowerMockito.verifyNew(Utility.class).withNoArguments(); PowerMockito.when(uti2.finalMethod(message)).thenReturn(message); String message2 = uti2.finalMethod(message); Mockito.verify(uti2).finalMethod(message); assertEquals(message, message2); } }
出力
次の出力は、テストが正常に実行されていることを示しています。