私は以下を使用しています。
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
。テストが終了したら、起こってほしいことが実際に起こったかどうかを確認します。これがあなたのテスト方法の最大の間違いです。メソッド呼び出しが実行される前に検証しようとしました。次に、次のことを指定していません。どれの検証したい静的メソッド。
その他の注意事項
これは主に私の個人的な好みです。物事には特定の順序で実行する必要がありますが、各グループ内には多少の余裕があります。これにより、どこで何が起こっているかをすばやく区別できます。
また、次のサイトの例を確認することを強くお勧めします。これらの例は非常に堅牢であり、必要なケースの大部分で役立ちます。
- https://github.com/powermock/powermock/wiki/Mockito(PowerMock の概要 / 例)
- http://site.mockito.org/mockito/docs/current/org/mockito/Mockito.html(Mockito の概要 / 例)