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 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

Schreibe einen Kommentar