Power Mockitoでstatic voidメソッドが呼び出されたことを確認する方法 質問する

Power Mockitoでstatic voidメソッドが呼び出されたことを確認する方法 質問する

私は以下を使用しています。

Powermock-mockito 1.5.12
Mockito 1.95
junit 4.11

これが私のユーティリティクラスです

public void InternalUtils {
    public static void sendEmail(String from, String[] to, String msg, String body) {
    }
}

テスト対象のクラスの要点は次のとおりです。

public class InternalService {
       public void processOrder(Order order) {
           if (order.isSuccessful()) {
               InternalUtils.sendEmail(...);
           }
       }
}

そして、これがテストです:

@PrepareForTest({InternalUtils.class})
@RunWith(PowerMockRunner.class)
public class InternalService {
   public void verifyEmailSend() {
        mockStatic(Internalutils.class);
        doNothing().when(InternalUtils, "sendEmail", anyString(), any(String.class), anyString(), anyString());
        Order order = mock(Order.class);
        when(order.isSuccessful()).thenReturn(true);
        InternalService is = new InternalService();

        verifyStatic(times(1));
        is.processOrder(order);
   }
}

上記のテストは失敗します。指定された検証モードは none ですが、コードによれば、注文が成功した場合は電子メールを送信する必要があります。

ベストアンサー1

動作をモックしている場合 ( などdoNothing())、 を呼び出す必要はまったくありませんverify*()。そうは言っても、テスト メソッドを書き直す方法は次のとおりです。

@PrepareForTest({InternalUtils.class})
@RunWith(PowerMockRunner.class)
public class InternalServiceTest { //Note the renaming of the test class.
   public void testProcessOrder() {
        //Variables
        InternalService is = new InternalService();
        Order order = mock(Order.class);

        //Mock Behavior
        when(order.isSuccessful()).thenReturn(true);
        mockStatic(Internalutils.class);
        doNothing().when(InternalUtils.class); //This is the preferred way
                                               //to mock static void methods.
        InternalUtils.sendEmail(anyString(), anyString(), anyString(), anyString());

        //Execute
        is.processOrder(order);            

        //Verify
        verifyStatic(InternalUtils.class); //Similar to how you mock static methods
                                           //this is how you verify them.
        InternalUtils.sendEmail(anyString(), anyString(), anyString(), anyString());
   }
}

何が起こっているのかをよりわかりやすくするために、4 つのセクションにグループ化しました。

1. 変数

ここでインスタンス変数 / メソッド引数 / モックコラボレーターを宣言することにしました。複数のテストで使用される場合は、テストクラスのインスタンス変数にすることを検討してください。

2. 模擬行動

ここで、すべてのモックの動作を定義します。テスト対象のコードを実行する前に、ここで戻り値と期待値を設定します。一般的に、ここでモックの動作を設定すれば、後で動作を検証する必要はありません。

3. 実行

ここでは特別なことは何もありません。これは、テスト対象のコードを開始するだけです。注目を集めるために、独自のセクションを設けるのが好きです。

4. 確認する

verifyこれは、またはで始まるメソッドを呼び出すときですassert。テストが終了したら、起こってほしいことが実際に起こったかどうかを確認します。これがあなたのテスト方法の最大の間違いです。メソッド呼び出しが実行される前に検証しようとしました。次に、次のことを指定していません。どれの検証したい静的メソッド。

その他の注意事項

これは主に私の個人的な好みです。物事には特定の順序で実行する必要がありますが、各グループ内には多少の余裕があります。これにより、どこで何が起こっているかをすばやく区別できます。

また、次のサイトの例を確認することを強くお勧めします。これらの例は非常に堅牢であり、必要なケースの大部分で役立ちます。

おすすめ記事