159

私はjunitテストでmockitoを使用しています。どのようにして例外を発生させ、それが発生したことをアサートしますか (一般的な擬似コード)

4

12 に答える 12

234

最初に2番目の質問に答えます。JUnit 4 を使用している場合は、テストに注釈を付けることができます

@Test(expected=MyException.class)

例外が発生したことをアサートします。そして、mockito で例外を「モック」するには、次を使用します

when(myMock.doSomething()).thenThrow(new MyException());
于 2013-04-26T19:12:14.293 に答える
81

BDDスタイル ソリューション (Java 8 に更新)

Mockito単独では、例外を処理するための最適なソリューションではありません。MockitoCatch-Exceptionを使用してください。

Mockito + Catch-Exception + AssertJ

given(otherServiceMock.bar()).willThrow(new MyException());

when(() -> myService.foo());

then(caughtException()).isInstanceOf(MyException.class);

サンプルコード

依存関係

于 2013-04-26T19:15:56.743 に答える
33

例外メッセージもテストしたい場合は、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"));
}
于 2016-12-29T19:58:17.083 に答える
32

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

于 2015-06-19T05:22:48.733 に答える
16

例外を次のように発生させます。

when(obj.someMethod()).thenThrow(new AnException());

テストがそのような例外をスローすることをアサートして、それが発生したことを確認します。

@Test(expected = AnException.class)

または、通常のモック検証によって:

verify(obj).someMethod();

後者のオプションは、テストが中間コードが例外を処理することを証明するように設計されている場合 (つまり、テスト メソッドから例外がスローされない場合) に必要です。

于 2013-04-26T19:12:32.623 に答える
7

私はこれがあなたのためにそれをするべきだと思います。

assertThrows(someException.class, ()-> mockedServiceReference.someMethod(param1,parme2,..));

于 2021-01-04T09:46:37.903 に答える