OOP Testen einer Exception mit JUnit

Haagy

Mitglied
Hallo Liebes Java-Forum,

ich stehe jetzt seit ein paar Tagen vor einem Problem das ich nicht lösen kann und auch bei der Internetsuche keine Ergebnisse gefunden habe. Vielleicht könnt Ihr mir ja weiter helfen.

Ich habe verschiedene REST-Services die ich aufrufen möchte. Über folgende Klasse bzw. der Methode startSearch werden die einzelnen Services angestoßen.

Java:
public class Search {
   public boolean startSearch(String searchTerm) throws NoSearchApiException, FileNotFoundException, IOException {
     if (!siList.isEmpty()) {
       //falls Liste vorhanden alle APIs der Liste aufrufen
       return true;
     } else if (si != null) {
       //wenn Liste nicht gesetzt dann einzelne API aufrufen
       return true;
     } else {
       //wenn keine API gesetzt ist soll eine Exception geschmissen werden
       throw new NoSearchApiException();
     }
     return false;
   }
}

Was ich im Folgenden versuche ist diese Methode per JUnit zu testen. Der IF-Case sowie ELSEIF-Case laufen ohne Probleme. Versuche ich jetzt denn ELSE-Case wie folgt zu testen,

Java:
   @Test(expected = NoSearchApiException.class)
    public void testSearchAufrufOhneInitialisierungEinerAPI() {
        try {
            hss.startSearch("java");
        } catch (NoSearchApiException e) {
            e.printStackTrace();
        }
    }

läuft dieser auf Failure (java.lang.AssertionError: Expected exception: de.hrw.advswen.utils.NoSearchApiException).
Das ist eigentlich genau die Exception, die ich erwarte und diese wird mir zudem auf der Konsole angezeigt. Warum ist dann der Test-Case nicht grün???😵😵

Ich habe auch schon alles mir erdenkliche ausprobiert von der Anordnung der einzelnen Exceptions in der throws deklaration bis hin zur Behandlung der anderen Exceptions per TRY/CATCH, sodass nur noch die gewünschte Exception in der Methodensignatur steht.

Vielleicht übersehe auch etwas.
Schonmal danke an alle Ideen.
Gruß Haagy
 
Zuletzt bearbeitet von einem Moderator:
Das was Saheeda schrieb^^
Java:
@Test(expected = NullpointerException.class)
public testNullpointerExample() {
    Company company = null;
    company.setName("TestCompany");
}
 
Danke für denn denkanstoß Saheeda und das Beispiel Jardcore.

Mein Problem war das ich die Exception hab fangen müssen, da meine selber geschriebene Exception von IOException geerbt hat. Hab es auf RuntimeException geändert und der Test läuft einwandfrei.

Danke!!
 
Warum musst du die Exception fangen? Man kann jede Exception im Testfall fliegen lassen. Ergänze die Methodensignatur einfach um "throws DeineException" und es sollte auch funktionieren.
 
Womit arbeitest du? Eclipse? Wenn du eine Methode aufrufst, die eine CheckedException wirfst, wird diese Methode rot unterkringelt und Eclipse bietet dir an, einen try-catch-Block drum herum zu machen, oder der Methodensignatur "throws DeineException" hinzuzufügen.
 
Genau das war mein Problem weswegen ich in die Exception in der Test-Methode per Try/Catch gefangen habe oder eben fangen musste. Durch die Throws-Deklaration funktioniert es auch mit einer Checked-Exception. Aber ich habe eben nicht an diese Deklaration in der Methodensignatur gedacht.

Und ja Eclipse.
 

Zurück
Oben