JUnit-Tests für eine Ausnahme eines bestimmten Typs
Ich bin zu wollen wissen, wenn ich testen (mit JUnit), dass eine bestimmte Nachricht erzeugt, indem eine Ausnahme geworfen bekommt, anstatt nur "ob oder nicht" eine Ausnahme geworfen wurde.
Zum Beispiel die JunitTest.java code wird tatsächlich den test zu bestehen, weil eine exception geworfen wurde, aber wenn ich auch wollte, um zu testen, ob die Zeichenfolge erzeugt, die durch die Ausnahme war gleich: "Test Ausnahme: ganze Zahl kann nicht negativ sein.." ist das möglich?
TestException.java
public class TestException extends Exception {
/**
* @param message informative message about the problem found
*/
public TestException (String message) {
super("Test Exception: " + message);
}
}
Test.java
public void function(Integer mustBePositive) throws TestException {
if (mustBePositive < 0) {
throw new TestException("Integer may not be negative..");
}
else {
mustBePositive = myNum
}
}
JunitTest.java
import org.junit.*;
public class JUnitTest {
@Test(expected = TestException.class)
public void functionTest() throws TestException {
function(-1);
}
}
- möglich, Duplikat der In Java, wie kann ich überprüfen einer geworfenen Ausnahme mit JUnit?
- die Antworten scheinen zu sein, die mit älteren Versionen von JUnit (keine
expected=...
annotation).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Anmerkung: ich glaube @Matthew ' s Antwort überlegen ist.
Können Sie die folgenden Struktur - tests, dass die richtige exception geworfen wurde (
TestException.class
) und, dass die Nachricht wie erwartet.BEARBEITEN
Warum ich rethrow Ausnahme (ein Kommentar): der erste test unten geht, während die zweite nicht. Also es fügt eine zusätzliche Ebene der Validierung. Nun, Wenn ich gefangen ExceptionB in dem code unten, beide tests scheitern würden.
Können Sie das standard-JUnit -TestRule ExpectedException. Dies ermöglicht Ihnen zu testen, dass eine Ausnahme geworfen wird, und auch testen Sie die Nachricht, die Sie begleitet, die Ausnahme. Zum Beispiel:
Den
expectMessage()
nimmt entweder einen String (einen substring der Nachricht) oder ein Matcher, so können Sie den regulären Ausdruck zu prüfen oder was auch immer.Ich es so machen:
Dies ist vielleicht nicht elegant, aber es ist leicht zu verstehen und deckt alle Grundlagen. disclaimer - ich habe es nicht kompiliert.
Andere haben schon darauf hingewiesen, die Struktur, die Sie verwenden können, um dies zu testen, aber ich würde nicht testen, die Nachricht selbst als das kann ziemlich spröde.
Sollten Sie erstellen Sie eine benutzerdefinierte Ausnahme, dass bekommt erhält alle erforderlichen Daten-und nur behaupten, dass die Daten vorhanden sind. Wenn Sie wirklich über die Nachricht dann können Sie unit-Tests, die separat auf die Ausnahme selbst.
Angesichts Ihrer Beispiel:
Konnte Sie nur werfen eine NegativeNumberException. Wenn Sie wirklich wollen, zu wissen, was die Zahl ist, könnte man den code so ändern, das als das argument:
Dann in Ihrem test:
Ihre Ausnahme, erzeugt die Nachricht jedoch es für richtig hält, und änderungen an diesem Ausgang nicht die welligkeit durch den rest der test-code
catch-Ausnahme gemacht wird, um dieses Szenario zu unterstützen:
import org.junit. * ;
public class JUnitTest {