JUnit - werfen von Exceptions testen

jared

Aktives Mitglied
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:
Java:
...
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:
Java:
...
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.
 
JUnit FAQ

Java:
@Test(expected=IllegalArgumentException.class)
public void testFailGetInstance() {
   MyClass.getInstance( );
}
 
Zuletzt bearbeitet:
Java:
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!
 
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?
 
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.
 
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.
 
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.
 
meinst du das:
Java:
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.
 
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 ^^
 
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.
 

Zurück
Oben