Wie bereits erwähnt, gibt es viele Möglichkeiten, mit Ausnahmen in JUnit umzugehen. Aber mit Java 8 gibt es eine weitere Möglichkeit: die Verwendung von Lambda-Ausdrücken. Mit Lambda-Ausdrücken können wir eine Syntax wie diese erreichen:
@Test
public void verifiesTypeAndMessage() {
assertThrown(new DummyService()::someMethod)
.isInstanceOf(RuntimeException.class)
.hasMessage("Runtime exception occurred")
.hasMessageStartingWith("Runtime")
.hasMessageEndingWith("occurred")
.hasMessageContaining("exception")
.hasNoCause();
}
assertThrown akzeptiert eine funktionale Schnittstelle, deren Instanzen mit Lambda-Ausdrücken, Methodenreferenzen oder Konstruktorreferenzen erstellt werden können. assertThrown, das diese Schnittstelle akzeptiert, erwartet eine Ausnahme und ist bereit, diese zu behandeln.
Dies ist eine relativ einfache, aber wirkungsvolle Technik.
Schauen Sie sich diesen Blogbeitrag an, in dem diese Technik beschrieben wird: http://blog.codeleak.pl/2014/07/junit-testing-exception-with-java-8-and-lambda-expressions.html
Der Quellcode ist hier zu finden: https://github.com/kolorobot/unit-testing-demo/tree/master/src/test/java/com/github/kolorobot/exceptions/java8
Offenlegung: Ich bin der Autor des Blogs und des Projekts.
27 Stimmen
Das Problem bei allen anderen Ansätzen ist, dass sie den Test immer beenden, sobald die Ausnahme ausgelöst wurde. Ich hingegen möchte oft noch
org.mockito.Mockito.verify
mit verschiedenen Parametern, um sicherzustellen, dass bestimmte Dinge geschehen (z. B. dass ein Logger-Dienst mit den richtigen Parametern aufgerufen wurde), bevor die Ausnahme ausgelöst wird.5 Stimmen
Sie können sehen, wie man Ausnahmen Test in JUnit Wiki-Seite github.com/junit-team/junit/wiki/Exception-testing
6 Stimmen
@ZeroOne - Für das würde ich zwei verschiedene Tests haben - eine für die Ausnahme und eine, um die Interaktion mit Ihrem Mock zu überprüfen.
0 Stimmen
Es gibt eine Möglichkeit, dies mit JUnit 5 zu tun, ich habe meine Antwort unten aktualisiert.
0 Stimmen
Hier ist ein schönes Beispiel für wie behaupten, dass eine Ausnahme geworfen wird es in JUnit4 und JUnit5