ホームページ  >  記事  >  Java  >  PowerMock を使用してテスト用のプライベート メソッドをモックするにはどうすればよいですか?

PowerMock を使用してテスト用のプライベート メソッドをモックするにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-03 15:06:30221ブラウズ

How do I Mock Private Methods for Testing Using PowerMock?

PowerMock を使用したテストのためのプライベート メソッドのモック

プライベート メソッドを使用してクラスをテストする場合、多くの場合、パブリック メソッドを確実に実行するために、これらのメソッドをモックする必要があります。 API は期待どおりに動作しています。ただし、Mockito などのフレームワークを使用する場合、これは困難になる可能性があります。

問題:

PowerMock を使用してプライベート メソッドをモックしようとしたときに、特に次のような問題が発生した可能性があります。プライベート メソッドの戻り値を操作したいと考えています。

解決策:

次の手順に従って、PowerMock を使用してテスト用にプライベート メソッドをモックします:

  1. 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>
  2. テスト用のクラスの準備: テスト クラスに @PrepareForTest の注釈を付け、モックするプライベート メソッドを含むクラスを指定します。

    <code class="java">@PrepareForTest(CodeWithPrivateMethod.class)</code>
  3. スパイ インスタンスの作成: PowerMockito を使用、プライベート メソッドを含むクラスのスパイ インスタンスを作成します。

    <code class="java">CodeWithPrivateMethod spy = PowerMockito.spy(new CodeWithPrivateMethod());</code>
  4. プライベート メソッドのモック: PowerMockito の when メソッドを使用してプライベート メソッドをモックします。クラス、メソッド名、パラメーターの型、および必要な戻り値を指定します。

    <code class="java">when(spy, method(CodeWithPrivateMethod.class, "doTheGamble", String.class, int.class))
     .withArguments(anyString(), anyInt())
     .thenReturn(true);</code>
  5. パブリック メソッドのテスト: プライベート メソッドを呼び出すパブリック メソッドを呼び出します。

    <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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。