JUnit4 erwartete Ausnahme
Ich mache Szenario-tests mit JUnit4 für ein Projekt.
In einem der tests, die ich brauche, um zu überprüfen, ob eine erwartete Ausnahme. Mit JUnit4 ich dies mit der annotation.
@Test(expected=...)
Nun das problem ist, dass unter den code im test, dass die Ausnahme ausgelöst, gibt es einige weitere Anmerkungen, die ich brauche, um zu überprüfen, welche nicht durchgeführt. Ein Beispiel:
@Test(expected=NullPointerException.class)
public void nullPointerTest() {
Object o = null;
o.toString();
assertTrue(false);
}
Diese tests geht, denn es wird die nullpointerexception aber es ist offensichtlich ein assertion error mit der asserTrue(false) und so will ich es fehl.
Was ist der beste Weg, dies zu beheben? Eine Lösung könnte die folgende sein, aber ich weiß nicht, ob dies der richtige Weg, es zu tun.
@Test
public void nullPointerTest2() {
boolean caught = false;
try{
Object o = null;
o.toString();
}
catch(NullPointerException e)
{
caught = true;
}
assertTrue(caught);
assertTrue(false);
}
Dieser zweite test ausfällt als vorhergesagt.
- Warum machst du
assertTrue(false)
? Oder geht das hier stehen einige Ihrer real-Prüfung-code? Nicht, dass "echte" code vom code abhängt, bevor er wirft einenNullPointerException
? - Ich bin mir nicht sicher, warum Sie würde wollen, dass. Es riecht nach schlechten test-design. Jede Prüfung sollte nur zum testen eine Sache.
- Ich schlage vor, dass Sie splitten, diese in zwei separate tests.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Betrachten:
Dies ermöglicht zusätzliche Kontrollen während immer noch volle Nutzung des JUnit-built-in-Ausnahme-Prüfung.
Außerdem halte ich die Verwendung von
@Rule ExpectedException
eine bessere option, dieexpected
in vielen Fällen.JUnit4 verhält sich wie erwartet: wenn eine Ausnahme geworfen wird, wird die Ausführung nicht fortsetzen. Also die
NullPointerException
erhält geworfen, die test-Methode beendet, JUnit4 markiert es als vorbei denn Sie erwartet eine Ausnahme. Den code nach der null-Dereferenzierung effektiv nicht vorhanden ist.Wenn Sie möchten, dass das Verhalten der zweite test, dann was du geschrieben hast ist eine gute Lösung. Aber es ist eine seltsame Sache zu wollen. Es scheint mir, dass Sie sind die Vermischung von zwei verschiedenen tests. Ein test sollte test eine exception geworfen wird, die unter außergewöhnlichen Umständen. Ein zweiter test sollte testen, was die zweite Behauptung überprüft.
weird
. Beachten Sie, dass im Fall einer Ausnahme wird ausgelöst, indem Sie die Klasse unter test, es könnte auch andere überprüfbare Schritte vor, um das auslösen der Ausnahme (zum Beispiel die Freigabe von Ressourcen, die Protokollierung der Fehler, Update-Status, etc.)