# JUnit - werfen von Exceptions testen



## jared (13. Jul 2011)

Hi!
Ich bin gerade dabei einen UnitTest zu schreiben für eine Singleton Klasse. Ich möchte getInstance() aufrufen. Rufe diese Methode in meinem Testfall auf und hoffe das diese mir die Exception wirft. Tut sie auch, nur wird diese in dem try-catch block in meinem Testfall nicht aufgefangen.

Weil dies nicht so funktioniert wie erhofft, habe ich zum Testen die getIntance()-Methode stark vereinfacht:

```
...
public static MyClass getInstance() throws IllegalArgumentException {
    throws new IllegalArgumentException("Exception");
}
...
```

Somit muss beim Aufruf dieser Methode in jedem Fall eine Exception geschmissen werden.
Mein Testfall sieht folgendermaßen aus:

```
...
public void testFailGetInstance() {
    MyClass test;

    try {
        test = MyClass.getInstance( );

        fail("...");
    }
    catch(IllegalArgumentException exception) {
        // this is ok
    }
}
...
```

Komischerweise funktioniert dies aber nicht.
In der Ausgabe in Eclipse für Unit-Tests gibt er mir aus, dass diese Exception geworfen wurde.
Ich verstehe nicht, weshalb dieser try-catch Block ignoriert wird.

Hoffe ihr könnt mir weiterhelfen.

mfg
jared.


----------



## schalentier (13. Jul 2011)

JUnit FAQ


```
@Test(expected=IllegalArgumentException.class)
public void testFailGetInstance() {
   MyClass.getInstance( );
}
```


----------



## jared (13. Jul 2011)

Habe ich gemacht, geht trotzdem nicht.


----------



## turtle (13. Jul 2011)

Verwendest Du auch jUnit 4 ?


----------



## jared (13. Jul 2011)

Wenn ich in die Configuration reinschaue unter TestRunner, ist JUnit 4 eingestellt.


----------



## turtle (13. Jul 2011)

```
import org.junit.Test;

public class SimpleTest {

	@Test(expected = IllegalArgumentException.class)
	public void testFailGetInstance() {
		SimpleTest.getInstance();
	}

	private static void getInstance() {
		throw new IllegalArgumentException("Oops");
	}
}
```

Funzt bei mir wunderbar!


----------



## jared (13. Jul 2011)

Bei mir aber nicht.
Ich habe die getInstance-Methode nicht in der TestKlasse implementiert sondern in einer andern. Keine Ahnung ob das was aus macht.
Ich habe jetzt auch noch ma geschaut. An anderen Stellen (TestKlassen), habe ich dies auch schon mal gemacht und es geht. Ich sehe zu den anderen TestCases keinen Unterschied zu dem aktuellen.
Kennt niemand eine Lösung hierfür?


----------



## maki (13. Jul 2011)

> Kennt niemand eine Lösung hierfür?


Die Lösungen wurden schon genannt, du scheinst noch ein anderes Problem zu haben.

Wird die erwartete Exception denn wirklich geworfen?
Wenn nicht, liegt es nicht am Test


----------



## turtle (13. Jul 2011)

> Ich habe die getInstance-Methode nicht in der TestKlasse implementiert sondern in einer andern. Keine Ahnung ob das was aus macht


Nein


----------



## jared (13. Jul 2011)

die Exception wird geworfen. Bei mir Links in dem JUnit-Reiter unten im Failure-Trace, zeigt er mir dies sogar an. Nur irgendwie ignoriert er den try/catch-Block und ich habe keine Ahnung wieso.


----------



## turtle (13. Jul 2011)

Wieso glaubst Du wird der try-catch Block ignoriert?

Im Code sehe ich nicht, dass Du irgendetwas im catch-Block machst. Wenn Du mal debuggst, siehst Du auch, das das Programm völlig korrekt die Exception fängt.

Dann darfst Du natürlich NICHT sagen, dass die expected-Exception eine IllegalArgument-Exception sein soll, weil Du die ja selber behandelst/abfängst, oder MIT expected-Annotation und im catch-Block die Exception wieder werfen.


----------



## jared (13. Jul 2011)

Wenn ich die Excpetion doch erwarte, dann mache ich doch nichts im catch-Block.
Ich habe obend die expected-Annotation entfernt und es tut sich trotzdem nichts.


----------



## maki (13. Jul 2011)

Zeig doch mal den Code der die Exception werfen sollte...


----------



## jared (13. Jul 2011)

meinst du das:

```
throw new IllegalArgumentException("The Model Reference must not be null!");
```

Wenn ich in meinem Unit-Test einen Breakpoint setzen will, ignoriert er den komplett. In einem anderen Unit-test hält er da ohne Probleme an. Ich versuche jetzt mal den Unit-Test zu löschen und manuell anzulegen ohne Unterstützung vom Eclipse.


----------



## maki (13. Jul 2011)

Zeig doch mal die ganze Methode welche die Exception werfen soll...


----------



## diggaa1984 (13. Jul 2011)

wenn du die annotation oben entfernst, was machst du dann im catch-block? eine art assert(true) oder so!? oder sind die tests per default true, wenn kein fehler geworfen wird? ich nutze zwar gerade TestNG, was ja arg verwandt ist mit JUnit, aber bin noch net so firm und nachschauen ist grad nich ^^


----------



## turtle (13. Jul 2011)

> Wenn ich in meinem Unit-Test einen Breakpoint setzen will, ignoriert er den komplett.



Was willst Du mir damit sagen (Laufzeit, IDE, ...)?


----------



## jared (13. Jul 2011)

Habe die Klasse gelöscht und den kompletten Test neu implementeirt und es funktioniert. KA was da schief ging.

Danke trotzdem für eure Hilfe.


----------

