私はjunitテストでmockitoを使用しています。どのようにして例外を発生させ、それが発生したことをアサートしますか (一般的な擬似コード)
12 に答える
最初に2番目の質問に答えます。JUnit 4 を使用している場合は、テストに注釈を付けることができます
@Test(expected=MyException.class)
例外が発生したことをアサートします。そして、mockito で例外を「モック」するには、次を使用します
when(myMock.doSomething()).thenThrow(new MyException());
BDDスタイル ソリューション (Java 8 に更新)
Mockito単独では、例外を処理するための最適なソリューションではありません。MockitoとCatch-Exceptionを使用してください。
Mockito + Catch-Exception + AssertJ
given(otherServiceMock.bar()).willThrow(new MyException());
when(() -> myService.foo());
then(caughtException()).isInstanceOf(MyException.class);
サンプルコード
依存関係
例外メッセージもテストしたい場合は、Mockito で JUnit の ExpectedException を使用できます。
@Rule
public ExpectedException expectedException = ExpectedException.none();
@Test
public void testExceptionMessage() throws Exception {
expectedException.expect(AnyException.class);
expectedException.expectMessage("The expected message");
given(foo.bar()).willThrow(new AnyException("The expected message"));
}
2015 年 6 月 19 日の更新された回答 (Java 8 を使用している場合)
ただ assertj を使用してください
assertj-core-3.0.0 + Java 8 ラムダの使用
@Test
public void shouldThrowIllegalArgumentExceptionWhenPassingBadArg() {
assertThatThrownBy(() -> myService.sumTingWong("badArg"))
.isInstanceOf(IllegalArgumentException.class);
}
参照: http://blog.codeleak.pl/2015/04/junit-testing-exceptions-with-java-8.html
例外を次のように発生させます。
when(obj.someMethod()).thenThrow(new AnException());
テストがそのような例外をスローすることをアサートして、それが発生したことを確認します。
@Test(expected = AnException.class)
または、通常のモック検証によって:
verify(obj).someMethod();
後者のオプションは、テストが中間コードが例外を処理することを証明するように設計されている場合 (つまり、テスト メソッドから例外がスローされない場合) に必要です。
私はこれがあなたのためにそれをするべきだと思います。
assertThrows(someException.class, ()-> mockedServiceReference.someMethod(param1,parme2,..));