60

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

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);
   }
}

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

4

2 に答える 2

74

動作を( のようなもので)嘲笑している場合は、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。テストが終わったら、望んでいたことが実際に起こったかどうかを確認します。それがあなたのテスト方法で見られる最大の間違いです。実行する機会が与えられる前に、メソッド呼び出しを検証しようとしました。次に、検証したい静的メソッドを指定していません。

その他の注意事項

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

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

于 2013-08-27T13:46:32.707 に答える