Gibt es eine bessere Möglichkeit zu behaupten, dass eine Methode in JUnit 5 eine Ausnahme auslöst?
Derzeit muss ich eine @Rule verwenden, um zu überprüfen, ob mein Test eine Ausnahme auslöst. Dies funktioniert jedoch nicht in den Fällen, in denen ich erwarte, dass mehrere Methoden Ausnahmen in meinem Test auslösen.
java
junit
junit5
junit-jupiter
steventrouble
quelle
quelle
Antworten:
Sie können verwenden
assertThrows()
, um mehrere Ausnahmen innerhalb desselben Tests zu testen. Mit der Unterstützung von Lambdas in Java 8 ist dies die kanonische Methode zum Testen auf Ausnahmen in JUnit.Gemäß den JUnit-Dokumenten :
quelle
() ->
zeigt auf einen Lambda-Ausdruck, der keine Argumente akzeptiert. Somit befindet sich der "Produktionscode", von dem erwartet wird, dass er die Ausnahme auslöst, in dem Codeblock, auf den verwiesen wird (dh diethrow new...
Anweisung in den geschweiften Klammern).In Java 8 und JUnit 5 (Jupiter) können wir Ausnahmen wie folgt geltend machen. Verwenden von
org.junit.jupiter.api.Assertions.assertThrows
Dieser Ansatz verwendet die Funktionsschnittstelle
Executable
inorg.junit.jupiter.api
.Verweisen :
quelle
assertThrows(NoSuchElementException.class, myLinkedList::getFirst);
Sie haben es in JUnit 5 geändert (erwartet: InvalidArgumentException, tatsächliche: aufgerufene Methode) und der Code sieht folgendermaßen aus:
quelle
Jetzt bietet Junit5 eine Möglichkeit, die Ausnahmen geltend zu machen
Sie können sowohl allgemeine als auch benutzerdefinierte Ausnahmen testen
Ein allgemeines Ausnahmeszenario:
ExpectGeneralException.java
ExpectGeneralExceptionTest.java
Ein Beispiel zum Testen von CustomException finden Sie hier: Beispiel für einen Ausnahmecode
ExpectCustomException.java
ExpectCustomExceptionTest.java
quelle
Ich denke, das ist ein noch einfacheres Beispiel
Wenn Sie
get()
ein optionales Element mit einem LeerzeichenArrayList
aufrufen, wird a ausgelöstNoSuchElementException
.assertThrows
deklariert die erwartete Ausnahme und stellt einen Lambda-Lieferanten bereit (nimmt keine Argumente entgegen und gibt einen Wert zurück).Vielen Dank an @prime für seine Antwort, die ich hoffentlich ausgearbeitet habe.
quelle
assertThrows
gibt die ausgelöste Ausnahme zurück. Sie können also wieNoSuchElementException e = assertThrows(NoSuchElementException.class, () -> opt2.get());
folgt vorgehen und beliebige Zusicherungen für das gewünschte Ausnahmeobjekt vornehmen.Sie können verwenden
assertThrows()
. Mein Beispiel stammt aus den Dokumenten http://junit.org/junit5/docs/current/user-guide/quelle
Ein noch einfacherer Einzeiler. Für dieses Beispiel sind unter Verwendung von Java 8 und JUnit 5 keine Lambda-Ausdrücke oder geschweiften Klammern erforderlich
quelle
Eigentlich denke ich, dass es einen Fehler in der Dokumentation für dieses spezielle Beispiel gibt. Die beabsichtigte Methode ist expectedThrows
quelle
Hier ist ein einfacher Weg.
Dies ist nur erfolgreich, wenn die erwartete Ausnahme ausgelöst wird.
quelle