PowerMock を使用したテストのためのプライベート メソッドのモック
プライベート メソッドを使用してクラスをテストする場合、多くの場合、パブリック メソッドを確実に実行するために、これらのメソッドをモックする必要があります。 API は期待どおりに動作しています。ただし、Mockito などのフレームワークを使用する場合、これは困難になる可能性があります。
問題:
PowerMock を使用してプライベート メソッドをモックしようとしたときに、特に次のような問題が発生した可能性があります。プライベート メソッドの戻り値を操作したいと考えています。
解決策:
次の手順に従って、PowerMock を使用してテスト用にプライベート メソッドをモックします:
PowerMock API のインポート: 必要な PowerMock アノテーションと API をテスト クラスに含めます。
<code class="java">import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyString; import static org.powermock.api.mockito.PowerMockito.when; import static org.powermock.api.support.membermodification.MemberMatcher.method;</code>
テスト用のクラスの準備: テスト クラスに @PrepareForTest の注釈を付け、モックするプライベート メソッドを含むクラスを指定します。
<code class="java">@PrepareForTest(CodeWithPrivateMethod.class)</code>
スパイ インスタンスの作成: PowerMockito を使用、プライベート メソッドを含むクラスのスパイ インスタンスを作成します。
<code class="java">CodeWithPrivateMethod spy = PowerMockito.spy(new CodeWithPrivateMethod());</code>
プライベート メソッドのモック: PowerMockito の when メソッドを使用してプライベート メソッドをモックします。クラス、メソッド名、パラメーターの型、および必要な戻り値を指定します。
<code class="java">when(spy, method(CodeWithPrivateMethod.class, "doTheGamble", String.class, int.class)) .withArguments(anyString(), anyInt()) .thenReturn(true);</code>
パブリック メソッドのテスト: プライベート メソッドを呼び出すパブリック メソッドを呼び出します。
<code class="java">spy.meaningfulPublicApi();</code>
例:
プライベート メソッド doTheGamble を持つ次のクラス CodeWithPrivateMethod を考えます。 :
<code class="java">public class CodeWithPrivateMethod { public void meaningfulPublicApi() { if (doTheGamble("Whatever", 1 << 3)) { throw new RuntimeException("boom"); } } private boolean doTheGamble(String whatever, int binary) { Random random = new Random(System.nanoTime()); boolean gamble = random.nextBoolean(); return gamble; } }</code>
doTheGamble をモックして常に true を返すには、次のテストを作成します。
<code class="java">@RunWith(PowerMockRunner.class) @PrepareForTest(CodeWithPrivateMethod.class) public class CodeWithPrivateMethodTest { @Test(expected = RuntimeException.class) public void when_gambling_is_true_then_always_explode() throws Exception { CodeWithPrivateMethod spy = PowerMockito.spy(new CodeWithPrivateMethod()); when(spy, method(CodeWithPrivateMethod.class, "doTheGamble", String.class, int.class)) .withArguments(anyString(), anyInt()) .thenReturn(true); spy.meaningfulPublicApi(); } }</code>
このようにして、テスト用のプライベート メソッドを効果的にモックして、パブリック メソッドを確実にモックできます。プライベート メソッドの実装が変更されていない場合でも、API は正しく機能します。
以上がPowerMock を使用してテスト用のプライベート メソッドをモックするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。