JUnit: Test-Ausnahme funktioniert nicht (AssertionError: Expected exception, selbst wenn eine Ausnahme geworfen)
Ich versuche zum testen meiner Klasse für eine Ausnahme. Ich habe versucht ein paar verschiedene Methoden, nichts funktioniert. Was mache ich hier falsch?
Die Klasse, die ich versuche zu testen, PrimeNumber.java:
public class PrimeNumber {
static final Logger LOG = LogManager.getLogger("Log");
private String primeNumberStr;
public PrimeNumber(String primeNumberStr) {
this.primeNumberStr = primeNumberStr;
}
public String getPrimeResult() {
String resultStr = "";
try {
//Convert user input to int
int primeNumberInt = Integer.parseInt(primeNumberStr);
//Beginning of return message
resultStr += primeNumberInt + " is ";
//Add "not" if it's not a prime
if (!Primes.isPrime(primeNumberInt))
resultStr += "NOT ";
//End return message
resultStr += "a prime";
//If not a valid number, catch
} catch (NumberFormatException e) {
//Log exception
LOG.warn("NumberFormatException" + e.getMessage());
//If empty user input
if (primeNumberStr.length() == 0)
resultStr += "No number inserted";
//Else not empty but not valid
else
resultStr += primeNumberStr + " is not a valid number";
resultStr += ". Only numbers without decimals are accepted.";
}
return resultStr;
}
}
Und jetzt Dinge, die ich versucht habe zu testen:
Mit Anmerkung
@Test(expected = NumberFormatException.class)
public void testNumberFormatExceptionBeingThrown() {
PrimeNumber primeNumber = new PrimeNumber("6dg");
primeNumber.getPrimeResult();
}
Ergebnisse in test fehlgeschlagen und:
java.lang.AssertionError: Expected exception: java.lang.Exception
Mit einer JUnit-Regel:
@Rule public ExpectedException thrown = ExpectedException.none();
@Test(expected = NumberFormatException.class)
public void testNumberFormatExceptionBeingThrown() {
thrown.expect(NumberFormatException.class);
thrown.expectMessage("For input string: \"a21\"");
PrimeNumber primeNumber = new PrimeNumber("a21");
primeNumber.getPrimeResult();
}
Ergebnisse in:
java.lang.AssertionError: Expected test to throw (an instance of java.lang.NumberFormatException and exception with message a string containing "For input string: \"a21\"")
at org.junit.Assert.fail(Assert.java:88)
at org.junit.rules.ExpectedException.failDueToMissingException(ExpectedException.java:263)
at org.junit.rules.ExpectedException.access$200(ExpectedException.java:106)
at org.junit.rules.ExpectedException$ExpectedExceptionStatement.evaluate(ExpectedException.java:245)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Gut, keine der Methoden, die Sie gebucht werfen Sie einen
Vergessen eine Zeile code (Aufruf der getPrimeResult () - Methode). Aber ich denke, ich habe etwas falsch verstanden zu testen Ausnahmen. Es ist also nicht möglich zu testen, eine Ausnahme wurde eingefangen? Ist es das, was du sagst?
Testen Sie eine Methode, mit
Warum etwas testen, wurde gefangen? Es macht meistens mehr Sinn zu testen, die Ausgaben der Funktionen. Eine Ausnahme ist eine Leistung nur, wenn Sie es heraus bekommt.
NumberFormatException
. Sicherlich Konstruktor nicht. Warum würden Sie denken, es wäre? Alles, was Sie tun, im Konstruktor zuweisen String
zu einem String
Feld. Ich bin verwirrt, warum Sie schrieb code, dass macht alles möglich, um Ausnahmen von geworfen, und dann erwarten, dass es auch Ausnahmen.Vergessen eine Zeile code (Aufruf der getPrimeResult () - Methode). Aber ich denke, ich habe etwas falsch verstanden zu testen Ausnahmen. Es ist also nicht möglich zu testen, eine Ausnahme wurde eingefangen? Ist es das, was du sagst?
Testen Sie eine Methode, mit
expected =
wenn diese Methode propagiert, die Ausnahme an die aufrufende Methode. So die test-Methode (oder der test-runner) fangen können und prüfen, ob die aufgefangene Ausnahme-matches erwartet. Wenn Sie fangen die exception selbst, dann kann man nicht testen, wie dieses.Warum etwas testen, wurde gefangen? Es macht meistens mehr Sinn zu testen, die Ausgaben der Funktionen. Eine Ausnahme ist eine Leistung nur, wenn Sie es heraus bekommt.
InformationsquelleAutor asmb | 2015-06-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Alles funktioniert wie es sollte. Sie haben erfolgreich verhindern Ihre Methoden werfen exceptions. Sie haben erfolgreich testen konnten, dass Sie tun Ausnahmen.
Es ist einfach, es macht keinen Sinn, zu tun, beide zur gleichen Zeit. , Die Sie brauchen, um zu entscheiden, wenn Sie möchten, dass jede Methode eine Ausnahme auslöst oder nicht, wenn da falsche Argumente.
Wenn Sie wollen eine Methode eine exception werfen, wenn da ein Falsches argument ist, dann nicht fangen und behandeln der Ausnahme, lass es einfach geworfen werden. Dann testen Sie Ihre Methode wirft die exception wie oben.
Wenn Sie nicht wollen, dass die Methode eine exception werfen, wenn da eine falsche argument, dann entscheiden Sie, was Sie wollen, es zu tun statt. Dann testen Sie Ihre Methode so funktioniert wie Sie es wollen. Wenn es eine exception wirft, wird der test fehlschlagen.
Das heißt, der Griff, wie Sie zahlen in Ihrer Klasse nicht viel Sinn. Sie bekommen Sie als
String
s und speichert Sie alsString
s, und dann wieder alsString
s, aber immer, wenn Sie mit Ihnen arbeiten, konvertieren Sie Sie hin und her zuint
s. Warum nicht einfachint
überall an Erster Stelle?InformationsquelleAutor Dan Getz
Ihre
getPrimeResult
ist eigentlich der Umgang mit der Ausnahme, im Gegensatz zu wodurch es zu vermehren, nicht weiter in der call-stack. Daher ist es nicht geworfen, und der test wird nie in der Lage sein, um Sie abzufangen und behaupten, gegen die es (in diesem Zustand).Während ich denke, dass dies ein besserer Ansatz, wenn Sie wollen, es zu verbreiten, durch die call-stack, würden Sie brauchen, um
throw
es, nachdem Sie erwischt habe.InformationsquelleAutor Makoto