Kursinhalt
Java JUnit Bibliothek. Arten von Tests
Java JUnit Bibliothek. Arten von Tests
Ausnahmen Testen
Das Werfen von Ausnahmen erfordert auch Unit-Tests. In JUnit 5 wurden Methoden zum Testen solcher Ausnahmen hinzugefügt. Die dahinterstehende Logik ist einfach:
"wenn erwartet wird, dass eine Ausnahme geworfen wird, aber nicht, dann funktioniert die Methode nicht korrekt und der Test schlägt fehl."
Umgekehrt, "wenn erwartet wird, dass keine Ausnahme geworfen wird, aber die Methode eine wirft, dann funktioniert die Methode nicht korrekt und der Test schlägt ebenfalls fehl."
Betrachten wir diese zwei Assertions, die verwendet werden, um das Werfen von Ausnahmen zu testen: assertThrows()
und assertDoesNotThrow()
:
`assertThrows()`
Wie der Name schon sagt, wird mit dieser Methode getestet, ob eine Ausnahme ausgelöst wird, wobei erwartet wird, dass eine Ausnahme ausgelöst wird.
Dies geschieht mit einem Lambda-Ausdruck. Zum Beispiel testen wir das Auslösen einer NullPointerException
, wenn die Methode auf einem null
-String verwendet wird:
Wie Sie sehen können, erstellen wir eine Variable vom Typ String
mit dem Wert null
und testen dann das Auslösen einer Ausnahme, wenn die Methode .length()
auf dieser Variablen aufgerufen wird. Wenn Sie Methoden auf einem String
mit einem null
-Wert aufrufen, wird eine NullPointerException
ausgelöst.
In der assertThrows
-Assertion geben wir die Klasse der Ausnahme an, die wir erwarten, in unserem Fall NullPointerException.class
. Dann verwenden wir einen Lambda-Ausdruck, um anzugeben, unter welcher Bedingung diese Ausnahme ausgelöst werden sollte. Die Syntax ist einfach:
Mit anderen Worten:
Wir erwarten, dass eine NullPointerException
ausgelöst wird, wenn die .length()
-Methode auf dem str
-Objekt aufgerufen wird, dessen Wert null
ist.
Es ist auch erwähnenswert, dass die assertThrows()
-Assertion die gefangene und getestete Ausnahme zurückgibt. Das bedeutet, dass wir eine Variable exception
mit dieser Methode initialisieren und später verwenden können.
Zum Beispiel:
Beste Praktiken
-
Testen Sie eine Ausnahme pro Test: Jede Testmethode sollte idealerweise nur eine spezifische Ausnahme testen. Dies macht Ihre Tests wartbarer und ihre Absicht klarer;
-
Testen Sie Ausnahmedetails: Wann immer möglich, testen Sie nicht nur den Typ der Ausnahme, sondern auch deren Nachricht oder andere Eigenschaften. Dies stellt sicher, dass die richtige Ausnahme aus dem richtigen Grund ausgelöst wird;
-
Verwenden Sie die neuesten Funktionen: Wenn Sie JUnit 5 verwenden, bevorzugen Sie den
assertThrows
-Ansatz wegen seiner Flexibilität und Klarheit. Er ermöglicht nicht nur die Überprüfung des Typs der ausgelösten Ausnahme, sondern auch weitere Assertions am Ausnahmeobjekt.
`assertDoesNotThrow()`
Manchmal müssen wir eine Methode testen, die eine Ausnahme auslöst, aber in unserem Fall sollte sie das nicht. Dies wird mit der 'assertDoesNotThrow()'-Assertion durchgeführt. Der Algorithmus hier ist derselbe wie bei der 'assertThrows()'-Assertion, außer dass wir die Ausnahme nicht angeben, die wir erwarten zu erhalten ( weil wir sie nicht erwarten ).
Die Syntax sieht folgendermaßen aus:
Wie Sie in diesem Test sehen können, überprüfen wir, dass die Methode .length()
keine Ausnahme wirft, wenn sie auf einem nicht-null-Objekt aufgerufen wird. Danach verifizieren wir, dass die Methode ihre Funktion korrekt ausführt und das richtige Ergebnis zurückgibt. Wie Sie sehen können, verwenden wir keine Ausnahme-Klasse in den Parametern, da wir keine Ausnahmen erwarten.
Alles sieht einfach aus. Im nächsten Kapitel sehen wir, wie Sie solche Tests selbst schreiben können!
1. Was ist der Zweck von assertThrows()
in JUnit 5?
2. Wie wird ein Lambda-Ausdruck in Verbindung mit assertThrows()
verwendet?
3. Welche Methode kann verwendet werden, um zu testen, dass keine Ausnahmen von einer Methode geworfen werden?
4. Was gibt assertThrows()
in JUnit 5 zurück?
5. Warum wird empfohlen, pro Testmethode nur eine Ausnahme zu testen?
6. Warum ist es im Kontext des Ausnahme-Tests wichtig, Details der Ausnahme wie die Nachricht zu testen?
Danke für Ihr Feedback!