web-dev-qa-db-ja.com

JUnit 5:例外をアサートする方法は?

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

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

115
steventrouble

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"));
}
170
steventrouble

Java 8とJUnit 5(Jupiter)では、次のようにして例外を主張できます。 org.junit.jupiter.api.Assertions.assertThrowsを使う

public static <TはThrowable> Tを継承するassertThrows(Class <T> expectedType、実行可能ファイル)

提供された実行可能ファイルの実行がexpectedTypeの例外をスローし、その例外を返すことをアサートします。

例外がスローされない場合、または異なるタイプの例外がスローされる場合、このメソッドは失敗します。

例外インスタンスに対して追加のチェックを実行したくない場合は、単に戻り値を無視してください。

@Test
public void itShouldThrowNullPointerExceptionWhenBlahBlah() {
    assertThrows(NullPointerException.class,
            ()->{
            //do whatever you want to do here
            //ex : objectName.thisMethodShoulThrowNullPointerExceptionForNullParameter(null);
            });
}

そのアプローチはorg.junit.jupiter.api内の機能インターフェースExecutableを使用します。

参照してください。

67
prime

彼らはそれをJUnit 5で変更し(予想:InvalidArgumentException、実際:起動されたメソッド)、コードは次のようになります。

@Test
public void wrongInput() {
    Throwable exception = assertThrows(InvalidArgumentException.class,
            ()->{objectName.yourMethod("WRONG");} );
}
22
jstar

今Junit5は例外を主張する方法を提供します

一般的な例外とカスタマイズされた例外の両方をテストできます

一般的な例外のシナリオ

ExpectGeneralException.Java

public void validateParameters(Integer param ) {
    if (param == null) {
        throw new NullPointerException("Null parameters are not allowed");
    }
}

ExpectGeneralExceptionTest.Java

@Test
@DisplayName("Test assert NullPointerException")
void testGeneralException(TestInfo testInfo) {
    final ExpectGeneralException generalEx = new ExpectGeneralException();

     NullPointerException exception = assertThrows(NullPointerException.class, () -> {
            generalEx.validateParameters(null);
        });
    assertEquals("Null parameters are not allowed", exception.getMessage());
}

あなたはここでCustomExceptionをテストするためのサンプルを見つけることができます: アサート例外コードサンプル

ExpectCustomException.Java

public String constructErrorMessage(String... args) throws InvalidParameterCountException {
    if(args.length!=3) {
        throw new InvalidParameterCountException("Invalid parametercount: expected=3, passed="+args.length);
    }else {
        String message = "";
        for(String arg: args) {
            message += arg;
        }
        return message;
    }
}

ExpectCustomExceptionTest.Java

@Test
@DisplayName("Test assert exception")
void testCustomException(TestInfo testInfo) {
    final ExpectCustomException expectEx = new ExpectCustomException();

     InvalidParameterCountException exception = assertThrows(InvalidParameterCountException.class, () -> {
            expectEx.constructErrorMessage("sample ","error");
        });
    assertEquals("Invalid parametercount: expected=3, passed=2", exception.getMessage());
}
16

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

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

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

私がうまく詳しく述べた彼の答えのための@primeに感謝します。

6
JesseBoyd

assertThrows()を使うことができます。私の例はdocs http://junit.org/junit5/docs/current/user-guide/ から抜粋したものです。

import org.junit.jupiter.api.Test;

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

....

@Test
void exceptionTesting() {
    Throwable exception = assertThrows(IllegalArgumentException.class, () -> {
        throw new IllegalArgumentException("a message");
    });
    assertEquals("a message", exception.getMessage());
}
5
Will Humphreys

実際、私はこの特定の例の文書に誤りがあると思います。意図されているメソッドはexpectThrowsです。

public static void assertThrows(
public static <T extends Throwable> T expectThrows(
1
Peter Isberg

これは簡単な方法です。

@Test
void exceptionTest() {

   try{
        model.someMethod("invalidInput");
        fail("Exception Expected!");
   }
   catch(SpecificException e){

        assertTrue(true);
   }
   catch(Exception e){
        fail("wrong exception thrown");
   }

}

あなたが期待するExceptionが投げられた時にのみ成功します。

1
kiwicomb123