Sie nähern sich dem falsch. Testen Sie einfach Ihre Funktionalität: Wenn eine Ausnahme ausgelöst wird, schlägt der Test automatisch fehl. Wenn keine Ausnahme ausgelöst wird, werden Ihre Tests alle grün angezeigt.
Ich habe festgestellt, dass diese Frage von Zeit zu Zeit auf Interesse stößt, daher werde ich ein wenig darauf eingehen.
Hintergrund zu Unit-Tests
Wenn Sie Unit-Tests durchführen, ist es wichtig, selbst zu definieren, was Sie als Arbeitseinheit betrachten. Grundsätzlich gilt: eine Extraktion Ihrer Codebasis, die mehrere Methoden oder Klassen enthalten kann oder nicht, die eine einzelne Funktionalität darstellen.
Oder wie in The art of Unit Testing, 2. Auflage von Roy Osherove , Seite 11 definiert:
Ein Komponententest ist ein automatisierter Code, der die zu testende Arbeitseinheit aufruft und dann einige Annahmen über ein einzelnes Endergebnis dieser Einheit überprüft. Ein Unit-Test wird fast immer mit einem Unit-Test-Framework geschrieben. Es kann einfach geschrieben werden und läuft schnell. Es ist vertrauenswürdig, lesbar und wartbar. Die Ergebnisse sind konsistent, solange sich der Produktionscode nicht geändert hat.
Es ist wichtig zu erkennen, dass eine Arbeitseinheit normalerweise nicht nur eine Methode ist, sondern im Grunde genommen eine Methode, und danach wird sie von einer anderen Arbeitseinheit gekapselt.
Idealerweise sollten Sie für jede einzelne Arbeitseinheit eine Testmethode haben, damit Sie immer sofort sehen können, wo etwas schief geht. In diesem Beispiel gibt es eine grundlegende Methode, getUserById()
die einen Benutzer zurückgibt, und es gibt insgesamt 3 Arbeitseinheiten.
Die erste Arbeitseinheit sollte prüfen, ob bei gültigen und ungültigen Eingaben ein gültiger Benutzer zurückgegeben wird.
Alle Ausnahmen, die von der Datenquelle ausgelöst werden, müssen hier behandelt werden: Wenn kein Benutzer vorhanden ist, sollte ein Test durchgeführt werden, der zeigt, dass eine Ausnahme ausgelöst wird, wenn der Benutzer nicht gefunden werden kann. Ein Beispiel hierfür könnte das sein, das IllegalArgumentException
mit der @Test(expected = IllegalArgumentException.class)
Anmerkung abgefangen wird .
Sobald Sie alle Ihre Anwendungsfälle für diese grundlegende Arbeitseinheit bearbeitet haben, steigen Sie eine Ebene höher. Hier machen Sie genau das Gleiche, aber Sie behandeln nur die Ausnahmen, die von der Ebene direkt unter der aktuellen kommen. Dies hält Ihren Testcode gut strukturiert und ermöglicht es Ihnen, schnell durch die Architektur zu laufen, um herauszufinden, wo etwas schief geht, anstatt überall hüpfen zu müssen.
Behandlung der gültigen und fehlerhaften Eingabe eines Tests
An dieser Stelle sollte klar sein, wie wir mit diesen Ausnahmen umgehen werden. Es gibt zwei Arten von Eingaben: gültige Eingabe und fehlerhafte Eingabe (die Eingabe ist im engeren Sinne gültig, aber nicht korrekt).
Wenn Sie mit gültigen Eingaben arbeiten , legen Sie die implizite Erwartung fest, dass jeder Test, den Sie schreiben, funktioniert.
Ein solcher Methodenaufruf kann folgendermaßen aussehen : existingUserById_ShouldReturn_UserObject
. Wenn diese Methode fehlschlägt (z. B. eine Ausnahme wird ausgelöst), wissen Sie, dass ein Fehler aufgetreten ist, und können mit dem Graben beginnen.
Wenn Sie einen weiteren Test ( nonExistingUserById_ShouldThrow_IllegalArgumentException
) hinzufügen , der die fehlerhafte Eingabe verwendet und eine Ausnahme erwartet, können Sie feststellen, ob Ihre Methode mit falschen Eingaben das tut, was sie tun soll.
TL; DR
Sie haben versucht, in Ihrem Test zwei Dinge zu tun: auf gültige und fehlerhafte Eingaben prüfen. Wenn Sie dies in zwei Methoden aufteilen, die jeweils eine Sache ausführen, erhalten Sie viel klarere Tests und einen viel besseren Überblick darüber, wo etwas schief geht.
Wenn Sie die geschichtete Arbeitseinheit berücksichtigen, können Sie auch die Anzahl der Tests reduzieren, die Sie für eine Ebene benötigen, die in der Hierarchie höher ist, da Sie nicht alles berücksichtigen müssen, was in den unteren Ebenen möglicherweise schief gelaufen ist: die Ebenen unterhalb der aktuellen Ebene sind eine virtuelle Garantie dafür, dass Ihre Abhängigkeiten funktionieren. Wenn etwas schief geht, befindet es sich in Ihrer aktuellen Ebene (vorausgesetzt, die unteren Ebenen werfen selbst keine Fehler).