360

JUnit 5 でメソッドが例外をスローしたことをアサートするより良い方法はありますか?

現在、テストが例外をスローすることを確認するために @Rule を使用する必要がありますが、これは、テストで複数のメソッドが例外をスローすることが予想される場合には機能しません。

4

10 に答える 10

610

を使用するassertThrows()と、同じテスト内で複数の例外をテストできます。Java 8 でのラムダのサポートにより、これは JUnit で例外をテストする標準的な方法です。

JUnitドキュメントごと:

import static org.junit.jupiter.api.Assertions.assertThrows;

@Test
void exceptionTesting() {
    MyException thrown = assertThrows(
           MyException.class,
           () -> myObject.doThing(),
           "Expected doThing() to throw, but it didn't"
    );

    assertTrue(thrown.getMessage().contains("Stuff"));
}
于 2016-10-26T17:19:17.453 に答える
10

これはもっと簡単な例だと思います

List<String> emptyList = new ArrayList<>();
Optional<String> opt2 = emptyList.stream().findFirst();
assertThrows(NoSuchElementException.class, () -> opt2.get());

get()空を含むオプションを呼び出すと、ArrayListがスローされNoSuchElementExceptionます。 assertThrows予想される例外を宣言し、ラムダ サプライヤーを提供します (引数を取らず、値を返します)。

@prime の回答に感謝します。

于 2017-12-05T20:55:54.467 に答える