例外発生後のMockitoの検証 Junit 4.10
質問
予想される例外が発生するメソッドをテストしています。私はまた、例外が投げられた後にいくつかのクリーンアップコードが(モックされたオブジェクト上で)呼び出されたことを確認する必要がありますが、その検証は無視されているように見えます。以下はそのコードです。私はJunitの
ExpectedException
Rule
を使用して、期待される例外を検証しています。
@Rule
public ExpectedException expectedEx = ExpectedException.none();
@Test
public void testExpectedException()
{
MockedObject mockObj = mock(MockedObj.class);
MySubject subject = new MySubject(mockedObj);
expectedEx.expect(MyException.class);
expectedEx.expectMessage("My exception message.");
subject.someMethodThrowingException();
verify(mockObj).
someCleanup(eq(...));
}
のようです。
verify
は完全に無視されているようです。どのようなメソッドを
verify
にどんなメソッドを入れても、私のテストはパスします。
なぜそれが起こっているのか、何か考えがありますか?
どのように解決するのですか?
ExpectedException
で動作します。
でテストメソッド全体を囲みます。
をtry-catchブロックの中で
JUnit の @Rule
. コードが例外を投げると、スタックを上がって一番近いtry/catchに行き、たまたまExpectedExceptionのインスタンスにあります(期待する例外であることをチェックします)。
Javaでは、キャッチされない例外がメソッド内で発生した場合、制御はそのメソッド内の後のステートメントに決して戻りません。ここでも同じルールが適用されます。 例外が発生した後のテストでは、制御は決して戻りません。
技術的には、最終ブロックの中に検証を入れることもできますが、その場合は
悪い習慣
.
となります。
EDIT
テスト中のシステムが予期せぬ例外を発生させたり、まったく例外が発生しなかったりした場合、有用な失敗メッセージやトレースが得られます。
finally
ブロックの中で検証やアサーションが失敗した場合、Javaは予期せぬ例外や予期せぬ成功についてのメッセージではなく、そのことを表示します。これはデバッグを困難にします。特に、エラーがエラーの根本原因に続くコードの行から発生し、その上のコードが成功したことを不正にほのめかすことになるからです。
もし本当に例外の後の状態を、メソッドごとに確認する必要があるのなら、いつでもこのイディオムに戻すことができます。
@Test
public void testExpectedException()
{
MockedObject mockObj = mock(MockedObj.class);
MySubject subject = new MySubject(mockedObj);
try {
subject.someMethodThrowingException();
fail("Expected MyException.");
} catch (MyException expected) {
assertEquals("My exception message.", expected.getMessage());
}
verify(mockObj).someCleanup(eq(...));
}
更新しました。 Java 8 のラムダ式では、関数型インターフェースの呼び出しを try ブロックで囲むことができます。 でラップすることができます。 . 私は、この構文のサポートが多くの標準的なテストライブラリに道を見つけると想像しています。
assertThrows(MyException.class,
() -> systemUnderTest.throwingMethod());
関連
-
JAVA_HOME環境変数が正しく定義されていない問題を解決する
-
BindException: アドレスはすでに使用中です:バインドエラー解決
-
CertificateException: XXXに一致するサブジェクトの代替DNS名が見つかりません 解決策
-
[解決済み] JUnit 4のテストで、ある例外が投げられたことをどのように断言しますか?
-
[解決済み] Mockitoでvoidメソッドをモックする方法
-
[解決済み] Mockitoを使用して特定のメソッドが呼び出されていないことを確認するにはどうすればよいですか?
-
[解決済み] voidメソッドが例外を投げるかどうかをMockitoがテストする
-
[解決済み] Mockito : メソッド内で生成されたオブジェクトでメソッドが呼び出されたことを確認する方法?
-
[解決済み] mockito verify()でメソッドが2回呼び出されたことを確認する方法
-
[解決済み】JUnit 5:例外がスローされたことをアサートする方法は?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
ApplicationContextの起動エラーです。条件レポートを表示するには、アプリケーションを'de'で再実行します。
-
StringBuilderが投げるArrayIndexOutOfBoundsExceptionの探索
-
強制型変換について
-
Java Notes 005_この行に複数のマーカーがある - キーを変数に解決できない - シンタックスエラー、ins
-
SocketException java.netの4つの例外解決策。
-
XXX型を囲むインスタンスがJavaでアクセスできない
-
X11 DISPLAY変数が設定されていない」問題の解決方法
-
春ブート複数のデータソースの管理(atomikos)同じサーバーホスト上の複数のプロジェクトを開始する複数のJava - jarのエラーソリューション
-
switch case文のcaseの後の列挙定数は列挙型なし
-
[解決済み] catch節とfinally節で投げられる例外