[解決済み] パワーモッキートでstatic voidメソッドが呼び出されたことを確認する方法
質問
下記を使用しています。
Powermock-mockito 1.5.12
Mockito 1.95
junit 4.11
以下は私のutilsクラスです。
public void InternalUtils {
public static void sendEmail(String from, String[] to, String msg, String body) {
}
}
テスト対象のクラスのgistです。
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ですが、コードによると、注文が成功した場合、メールが送信される必要があります。
解決するには?
動作をモックしている場合(例えば
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の概要/使用例)
関連
-
[解決済み】Javaの".class期待値"
-
[解決済み】Eclipseがエラーメッセージ "Java was started but returned exit code = 1" を返す
-
[解決済み] Mockitoでvoidメソッドをモックする方法
-
[解決済み] 例外がスローされたことを確認するためにAssertを使用するにはどうすればよいですか?
-
[解決済み] Mockitoを使用して特定のメソッドが呼び出されていないことを確認するにはどうすればよいですか?
-
[解決済み] Mockitoは複数回呼び出されたメソッドの引数をキャプチャできますか?
-
[解決済み] voidメソッドが例外を投げるかどうかをMockitoがテストする
-
[解決済み] Mockitoで静的メソッドをモックする
-
[解決済み] Mockito : メソッド内で生成されたオブジェクトでメソッドが呼び出されたことを確認する方法?
-
[解決済み] mockito verify()でメソッドが2回呼び出されたことを確認する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】リンクリストの負の値の数でnegativeCntrを代入する
-
[解決済み】Javaの".class期待値"
-
[解決済み】Java、"変数名 "を変数に解決することができない
-
[解決済み] java のクラス内のコンストラクタは、指定された型に適用できない
-
[解決済み】"比較メソッドはその一般契約に違反する!"
-
[解決済み] 二項演算子「&」のオペランド型がおかしい java
-
[解決済み】「error: '.class' expected」の意味と修正方法について
-
[解決済み】 JAVA 変数宣言はここではできない
-
[解決済み】Java LinkedListでNodesを使用する
-
[解決済み】Java: GZIPInputStreamの作成に失敗しました。GZIP形式ではありません