回答:
を使用する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"));
}
() ->
ゼロの引数を受け入れるラムダ式を指します。したがって、例外をスローすることが予想される「本番コード」は、ポイントされるコードブロック(つまり、throw new...
中括弧内のステートメント)にあります。
Java 8およびJUnit 5(Jupiter)では、次のように例外をアサートできます。使用するorg.junit.jupiter.api.Assertions.assertThrows
public static <T extends Throwable> T assertThrows(Class <T> expectedType、Executable executable)
提供された実行可能ファイルの実行がexpectedTypeの例外をスローし、その例外を返すことを表明します。
例外がスローされない場合、または異なるタイプの例外がスローされる場合、このメソッドは失敗します。
例外インスタンスに対して追加のチェックを実行しない場合は、戻り値を無視してください。
@Test
public void itShouldThrowNullPointerExceptionWhenBlahBlah() {
assertThrows(NullPointerException.class,
()->{
//do whatever you want to do here
//ex : objectName.thisMethodShoulThrowNullPointerExceptionForNullParameter(null);
});
}
そのアプローチでは、の機能インターフェイスを使用Executable
しorg.junit.jupiter.api
ます。
参照:
assertThrows(NoSuchElementException.class, myLinkedList::getFirst);
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());
}
これはもっと簡単な例だと思います
List<String> emptyList = new ArrayList<>();
Optional<String> opt2 = emptyList.stream().findFirst();
assertThrows(NoSuchElementException.class, () -> opt2.get());
get()
空ArrayList
を含むオプションを呼び出すと、がスローされますNoSuchElementException
。 assertThrows
予期される例外を宣言し、ラムダサプライヤーを提供します(引数を取りません。値を返します)。
@primeに彼の答えを感謝します。
assertThrows
はスローされた例外を返します。したがってNoSuchElementException e = assertThrows(NoSuchElementException.class, () -> opt2.get());
、以下のようにして、必要な例外オブジェクトに対してあらゆる種類のアサーションを実行できます。
使用できますassertThrows()
。私の例は、ドキュメント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());
}
さらにシンプルなワンライナー。Java 8とJUnit 5を使用するこの例では、ラムダ式や中括弧は不要です
import static org.junit.jupiter.api.Assertions.assertThrows;
@Test
void exceptionTesting() {
assertThrows(MyException.class, myStackObject::doStackAction, "custom message if assertion fails...");
// note, no parenthesis on doStackAction ex ::pop NOT ::pop()
}
実際、私はこの特定の例のドキュメントに誤りがあると思います。意図されているメソッドはexpectThrowsです
public static void assertThrows(
public static <T extends Throwable> T expectThrows(
ここに簡単な方法があります。
@Test
void exceptionTest() {
try{
model.someMethod("invalidInput");
fail("Exception Expected!");
}
catch(SpecificException e){
assertTrue(true);
}
catch(Exception e){
fail("wrong exception thrown");
}
}
期待する例外がスローされたときにのみ成功します。