In JUnit 4 und 5 wird eine Ausnahme ausgelöst

1. Einleitung

In diesem kurzen Tutorial erfahren Sie, wie Sie testen können, ob mithilfe der JUnit-Bibliothek eine Ausnahme ausgelöst wurde.

Wir werden natürlich sicherstellen, dass sowohl die Versionen JUnit 4 als auch JUnit 5 abgedeckt werden.

2. Einheit 5

JUnit 5 Jupiter Assertions API führt die assertThrows- Methode zum Aktivieren von Ausnahmen ein.

Dies erfordert den Typ der erwarteten Ausnahme und eine ausführbare Funktionsschnittstelle, über die der zu testende Code über einen Lambda-Ausdruck übergeben werden kann:

@Test public void whenExceptionThrown_thenAssertionSucceeds() { Exception exception = assertThrows(NumberFormatException.class, () -> { Integer.parseInt("1a"); }); String expectedMessage = "For input string"; String actualMessage = exception.getMessage(); assertTrue(actualMessage.contains(expectedMessage)); }

Wenn die erwartete Ausnahme ausgelöst wird , gibt assertThrows die Ausnahme zurück , sodass wir auch die Nachricht bestätigen können.

Darüber hinaus ist zu beachten, dass diese Behauptung erfüllt ist, wenn der beigefügte Code eine Ausnahme vom Typ NullPointerException oder einem seiner abgeleiteten Typen auslöst .

Dies bedeutet, dass, wenn wir Exception als erwarteten Ausnahmetyp übergeben, jede ausgelöste Ausnahme die Assertion erfolgreich macht, da Exception der Supertyp für alle Ausnahmen ist.

Wenn wir den obigen Test ändern, um eine RuntimeException zu erwarten , besteht dies auch:

@Test public void whenDerivedExceptionThrown_thenAssertionSucceds() { Exception exception = assertThrows(RuntimeException.class, () -> { Integer.parseInt("1a"); }); String expectedMessage = "For input string"; String actualMessage = exception.getMessage(); assertTrue(actualMessage.contains(expectedMessage)); }

Die assertThrows () -Methode ermöglicht eine feinkörnigere Steuerung der Logik für die Ausnahmebestätigung, da wir sie verwenden könnenes um bestimmte Teile des Codes.

3. Einheit 4

Bei Verwendung von JUnit 4 können wir einfach das erwartete Attribut der @ Test- Annotation verwenden, um zu deklarieren, dass eine Ausnahme irgendwo in der mit Annotationen versehenen Testmethode ausgelöst wird.

Wenn der Test ausgeführt wird, schlägt er daher fehl, wenn die angegebene Ausnahme nicht ausgelöst wird, und besteht, wenn er ausgelöst wird:

@Test(expected = NullPointerException.class) public void whenExceptionThrown_thenExpectationSatisfied() { String test = null; test.length(); }

In diesem Beispiel haben wir erklärt, dass wir erwarten, dass unser Testcode zu einer NullPointerException führt .

Dies ist ausreichend, wenn wir nur behaupten möchten, dass eine Ausnahme ausgelöst wird.

Wenn wir einige andere Eigenschaften der Ausnahme überprüfen müssen, können wir die ExpectedException- Regel verwenden.

Sehen wir uns ein Beispiel für die Überprüfung der Nachrichteneigenschaft einer Ausnahme an:

@Rule public ExpectedException exceptionRule = ExpectedException.none(); @Test public void whenExceptionThrown_thenRuleIsApplied() { exceptionRule.expect(NumberFormatException.class); exceptionRule.expectMessage("For input string"); Integer.parseInt("1a"); }

Im obigen Beispiel deklarieren wir zuerst die ExpectedException- Regel. In unserem Test behaupten wir dann, dass der Code, der versucht, einen Integer- Wert zu analysieren, zu einer NumberFormatException mit der Meldung "For input string" führt.

4. Fazit

In diesem Artikel haben wir die Durchsetzung von Ausnahmen sowohl mit JUnit 4 als auch mit JUnit 5 behandelt.

Der vollständige Quellcode für die Beispiele ist auf GitHub verfügbar.