Ich habe einige JUnit-Tests mit @Test
Anmerkungen geschrieben. Wenn meine Testmethode eine aktivierte Ausnahme auslöst und ich die Nachricht zusammen mit der Ausnahme bestätigen möchte, gibt es eine Möglichkeit, dies mit der JUnit- @Test
Annotation zu tun ? AFAIK, JUnit 4.7 bietet diese Funktion nicht, aber werden sie in zukünftigen Versionen bereitgestellt? Ich weiß, dass Sie in .NET die Nachricht und die Ausnahmeklasse bestätigen können. Auf der Suche nach ähnlichen Funktionen in der Java-Welt.
Das ist was ich will:
@Test (expected = RuntimeException.class, message = "Employee ID is null")
public void shouldThrowRuntimeExceptionWhenEmployeeIDisNull() {}
@expectedExceptionMessage
Anmerkungen in PHPUnit.Antworten:
Sie können die
@Rule
Anmerkung folgendermaßen verwendenExpectedException
:Beachten Sie, dass das Beispiel in den
ExpectedException
Dokumenten (derzeit) falsch ist - es gibt keinen öffentlichen Konstruktor, daher müssen Sie verwendenExpectedException.none()
.quelle
expectMessage
als leere Zeichenfolge angegeben wurde, wurde der Vergleich für die Nachricht nicht durchgeführtthrows RuntimeException
nach dem Hinzufügen von Code eine Ausnahme auslösen . Fangen Sie es nicht ...failure.expectMessage(CoreMatchers.equalTo(...))
Ich mag die
@Rule
Antwort. Wenn Sie jedoch aus irgendeinem Grund keine Regeln verwenden möchten. Es gibt eine dritte Option.quelle
Müssen Sie verwenden
@Test(expected=SomeException.class)
? Wenn wir die eigentliche Meldung der Ausnahme bestätigen müssen, tun wir dies.quelle
@Test(expected=...)
undExpectedException
, ist , dass ich bei zahlreichen Gelegenheiten jemand gesehen haben vergessen , den Anruf zu setzen , umfail()
am Ende destry
Blockes . Wenn Sie nicht von der Codeüberprüfung erfasst werden, ist Ihr Test möglicherweise falsch positiv und besteht immer.In JUnit 4.13 können Sie Folgendes tun:
Dies funktioniert auch in JUnit 5, jedoch mit unterschiedlichen Importen:
quelle
Eigentlich ist die beste Verwendung mit try / catch. Warum? Weil Sie den Ort steuern können, an dem Sie die Ausnahme erwarten.
Betrachten Sie dieses Beispiel:
Was ist, wenn eines Tages der Code geändert wird und die Testvorbereitung eine RuntimeException auslöst? In diesem Fall wird der tatsächliche Test nicht einmal getestet, und selbst wenn keine Ausnahme ausgelöst wird, besteht der Test.
Deshalb ist es viel besser, try / catch zu verwenden, als sich auf die Annotation zu verlassen.
quelle
RuntimeException
als Beispiel diese Ausnahme durch eine andere Ausnahme ersetzt.Raystorm hatte eine gute Antwort. Ich bin auch kein großer Fan von Regeln. Ich mache etwas Ähnliches, außer dass ich die folgende Utility-Klasse erstelle, um die Lesbarkeit und Benutzerfreundlichkeit zu verbessern. Dies ist eines der großen Pluspunkte von Anmerkungen.
Fügen Sie diese Dienstprogrammklasse hinzu:
Dann brauche ich für meinen Unit-Test nur diesen Code:
quelle
Bei Verwendung von @Rule wird der Ausnahmesatz auf alle Testmethoden in der Testklasse angewendet.
quelle
Ich mochte es nie, mit Junit Ausnahmen geltend zu machen. Wenn ich das "Erwartete" in der Anmerkung verwende, scheinen wir aus meiner Sicht das Muster "Gegeben, Wann, Dann" zu verletzen, da das "Dann" oben in der Testdefinition steht.
Wenn wir "@Rule" verwenden, müssen wir uns auch mit so viel Boilerplate-Code auseinandersetzen. Wenn Sie also neue Bibliotheken für Ihre Tests installieren können, würde ich empfehlen, einen Blick auf AssertJ zu werfen (diese Bibliothek wird jetzt mit SpringBoot geliefert).
Dann ein Test, der nicht gegen die "gegebenen / wann / dann" -Prinzipien verstößt, und der mit AssertJ durchgeführt wird, um Folgendes zu überprüfen:
1 - Die Ausnahme ist das, was wir erwarten. 2 - Es hat auch eine erwartete Nachricht
Wird so aussehen:
quelle
Ich mag die Antwort von user64141, habe aber festgestellt, dass sie allgemeiner sein könnte. Hier ist meine Einstellung:
Beachten Sie, dass das Belassen der Anweisung "fail" im try-Block dazu führt, dass die zugehörige Assertion-Ausnahme abgefangen wird. Die Verwendung von return innerhalb der catch-Anweisung verhindert dies.
quelle
Importieren Sie die Catch-Exception- Bibliothek und verwenden Sie diese. Es ist viel sauberer als die
ExpectedException
Regel oder eintry-catch
.Beispiel aus ihren Dokumenten:
quelle
quelle
Junit
aberTestNG