JUnit unter Eclipse: Problem mit Exception

Status
Nicht offen für weitere Antworten.

Professor Chaos

Aktives Mitglied
Hallo,

führt man eine JUnit Testklasse mit mehreren Testmethoden unter Eclipse aus, so werden alle Methoden nacheinander ausgeführt. Je nach dem, ob sie erfolgreich oder nicht erfolgreich beendet werden, steht im JUnit Übersichtsfenster hinter der jeweiligen Testmethode ein gründer Haken oder ein rotes X. Aber selbst, wenn (unvorhergesehene) Exceptions geworfen werden, werden ALLE Methoden ausgeführt.

Also, ich habe zwei Testmethoden, die nacheinander auseführt werden. Eigentlich sollten beide Methoden ohne Fehler (insb. ohne Exceptions) ausgeführt werden. Es heißt, dass man Methoden, die potentiell Exceptions werfen können, dies im Testcase aber nicht vorgesehen ist, nicht mit einen try-catch statement umgeben soll.

Das habe ich getan.

So, nun komme ich endlich zu meinem Problem:
Eine unvorhergesehen Exception wird geworfen und die JVM stoppt! Ich bekomme auf der Konsole die Exception präsentiert, aber es wird nur meine erste JUnit Testmethode ausgeführt, nicht aber die zweite. Entsprechend sehe ich in der oben beschriebenen Übersicht weder einen grünen Haken (das ist klar), noch ein rotes X! Es existiert aber keine System.exit(0)-Anweisung. Es wird nur "normal" eine Exception geworfen. Aber diese killt JUnit. Was könnten hierfür mögliche Ursachen sein?

Hier ein Minimalbsp. meines TestCodes:

Code:
/**
 * @throws MyException1
 * @throws MyException2
 */
public void testOne() throws MyException1, MyException2{

	String[] callingArgument = new String[]{"1","2"};

	System.out.println();
	TestedClass.main(callingArgument);
	System.out.println();
}

/**
 * @throws MyException1
 * @throws MyException2
 */
public void testTwo() throws MyException1, MyException2{

	String[] callingArgument = new String[]{"3","4"};

	System.out.println();
	TestedClass.main(callingArgument);
	System.out.println();
}

Nochmals auf den Punkt gebracht: Wird TestedClass mit testOne aufgerufen, so wird Exception1 geworfen (aber auf der Konsole, statt im dafür vorgesehenen JUnit Fenster) und testTwo wird nicht mehr ausgeführt! Ich erwarte aber, dass testOne als nicht erfolgreich gekennzeichnet wird (rotes X), die Exception im dafür vorgesehenen JUnit Fenster aufgelistet wird und testTwo trotzdem ausgeführt wird.
In anderen Testcases war dies bislang auch immer der Fall, nur funktiniert es hier nciht mehr. Hat jemand eine Idee für eine mögliche Ursache?

Hier die Exception:
Code:
java.io.IOException: MY SELF WRITTEN MESSAGE
	at (EDIT: MY CLASSNAMES, ETC)
	at testsWithJUnit.Test.testOne(Test.java:54)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at junit.framework.TestCase.runTest(TestCase.java:168)
	at junit.framework.TestCase.runBare(TestCase.java:134)
	at junit.framework.TestResult$1.protect(TestResult.java:110)
	at junit.framework.TestResult.runProtected(TestResult.java:128)
	at junit.framework.TestResult.run(TestResult.java:113)
	at junit.framework.TestCase.run(TestCase.java:124)
	at junit.framework.TestSuite.runTest(TestSuite.java:232)
	at junit.framework.TestSuite.run(TestSuite.java:227)
	at org.junit.internal.runners.OldTestClassRunner.run(OldTestClassRunner.java:76)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:45)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
 
M

maki

Gast
Exception handling in Unittests ist imho grundlegend falsch (mit einer einzigen Ausnahme).
Was willst du denn mit deiner Exception machen??? Kannst doch gar nicht sinnvoll darauf reagieren...

Entweder ein Test läuft durch, oder er schlägt fehl (fail()), im Falle einer Exception gibt es einen Error.

So sollte dein Code eher aussehen:
Code:
public void testOne() throws Exception {

   String[] callingArgument = new String[]{"1","2"};
   TestedClass.main(callingArgument);
   assertXXX( "message", condition);
}

public void testTwo() throws Exception {

   String[] callingArgument = new String[]{"3","4"};
   TestedClass.main(callingArgument);
   assertXXX( "message", condition);
}
 

Professor Chaos

Aktives Mitglied
maki hat gesagt.:
Was willst du denn mit deiner Exception machen??? Kannst doch gar nicht sinnvoll darauf reagieren...
Ich möchte ja gar nicht darauf reagieren, der Punkt ist doch, dass diese Exception in meinem TestCase eigentlich gar nicht geworfen werden dürfte. Da sie aber dennoch geworfen wird, soll mir JUnit natürlich mitteilen: "testOne() failed, da die folgende Exception geworfen wurde".

Aber das passiert nunmal nicht! Statt dass die geworfene Exception im dafür vorgesehenen JUnit-Fenster dargestellt wird, wird sie auf die Konsole ausgegeben. Außerdem wird danach der zweite Test nicht durchgeführt. Beides sind Verhaltensweisen, die so nicht gedacht sind.

maki hat gesagt.:
So sollte dein Code eher aussehen:
Das ändert aber nichts. Aber gut, dann ändere ich es eben mal ab:

Code:
public void testOne() throws Exception {

   String[] callingArgument = new String[]{"1","2"};
   TestedClass.main(callingArgument);
   assertTrue("blub!",42>23);
}

public void testTwo() throws Exception {

   String[] callingArgument = new String[]{"3","4"};
   TestedClass.main(callingArgument);
   assertTrue("blub!",42>23);
}
Und was ist nun? Natürlich noch immer dasselbe Problem: Das assertTrue wird gar nicht erst erreicht, da TestedClass eine Exception wirft. Das ist ja eigentlich auch nichts schlechtes. Das Problem ist nur, dass nach dieser Exception testTwo() nicht ausgeführt wird, und dass die Exception eben nicht (sorry, ich wiederhole mich) im dafür vorgesehenen JUnit Fenster angezeigt wird, sondern auf der Konsole.
 
M

maki

Gast
"testOne() failed, da die folgende Exception geworfen wurde".
Wie gesagt, sollte eigentlich einen Error anstatt ein Failed produzieren, aber abbrechen dürfte der Test deswegen eigentlich nicht.

Hab es gerade hiermit bei mir gestest (JUnit 3.8), beide Tests werden ausgeführt, bei testError wird ein Error angezeigt:
Code:
public class ErrorTestCase extends TestCase {
	
	public void testError() 
	throws Exception {
		throw new Exception("Testing error");
	}
	
	public void testAfterError()
	throws Exception {
		assertTrue(true);
	}
}
 

Professor Chaos

Aktives Mitglied
maki hat gesagt.:
"testOne() failed, da die folgende Exception geworfen wurde".
Wie gesagt, sollte eigentlich einen Error anstatt ein Failed produzieren, aber abbrechen dürfte der Test deswegen eigentlich nicht.
Achso, ja, ich meinte eigentlich auch einen Error, habe mich nur falsch ausgedrückt.

maki hat gesagt.:
Hab es gerade hiermit bei mir gestest (JUnit 3.8), beide Tests werden ausgeführt, bei testError wird ein Error angezeigt:
Wenn ich deine TestCases vor meine schiebe, werden sie auch korrekt ausgeführt, d.h. er zeigt mir bei testError() korrekt das rote X an (mit der Exception-Meldung im JUnit), und bei testAfterError() korrekt den grünen Haken, genau so, wie ich es gerne hätte. Führt er danach allerdings meine Methode testOne() aus, ist es wieder dasselbe Spiel: Es erscheint weder ein grüner Haken, noch ein rotes X. Und außerdem wird die Exception wieder auf der Konsole ausgegeben, statt im JUnit Fenster. Mir ist das ein Rätsel...

Es wird noch seltsamer. Die Exception, die geworfen wird, ist (korrekter Weise, ich kenne den Fehler) eine IOException, siehe:
Code:
java.io.IOException: MY MESSAGE	at [...]
Das seltsame ist nun, dass ich diese Exception nicht abfangen kann! Hier der modifizierte Code:

Code:
	public void testOne() throws IOException{
		String[] callingArgument = new String[]{"1","2"};

		try{
			TestedClass.main(callingArgument);
		}catch(IOException e){
			System.out.println("strange...");
			System.out.println(e.getMessage());
		}
		
		assertTrue("blub!",42>23);
		System.out.println();
	}
Auch wenn ich eine Exception abfange (das sollte schließlich in jedem Fall funktionieren), ändert sich nichts.

Also, noch irgendwelche Ideen, wieso JUnit nicht in der Lage ist, diese Exception abzufangen?

Ich wollte noch posten, welche JUnit Version ich nutze, finde das aber nicht heraus... Wo kann man das nachlesen? Jedenfalls ist es wohl eine Version 4.x, welche, weiß ich aber nicht.
 
M

maki

Gast
Die gestestete Klasse macht aber keinen System.exit(0) o.ä?

Könnte ja sein dass die Klasse die Exception auf Sysout ausgibt und dann die VM beendet, etwas anderes fällt mir auf die schnelle nciht ein.
 

Professor Chaos

Aktives Mitglied
maki hat gesagt.:
Die getestete Klasse macht aber keinen System.exit(0) o.ä?

Könnte ja sein dass die Klasse die Exception auf System.out ausgibt und dann die VM beendet, etwas anderes fällt mir auf die Schnelle nicht ein.
Diese Idee hatte ich natürlich auch, aber leider ist dem nicht so. Btw. war das daher auch eine meiner ersten Aussagen: :)

Professor Chaos hat gesagt.:
Es existiert aber keine System.exit(0)-Anweisung. Es wird nur "normal" eine Exception geworfen.
Ich bin daher überfragt. Wer Rat weiß, bitte posten, egal wie alt dieser Thread hier bis dahin sein wird. Falls ich nämlich selbst des Rätsels Lösung finde, werde ich dies hier posten.
 

Professor Chaos

Aktives Mitglied
Schweren Herzens und mit gesenktem Kopf :oops: kann ich nun die Lösung präsentieren:

Es gab leider tatsächlich eine System.exit(0)-Anweisung. Ich GARANTIERE, dass ich danach (per Befehl) gesucht habe, denn das war ja auch meine erste Idee als mögliche Ursache. Ich weiß nicht, wieso ich es damals nicht fand, womöglich ein TypeO.

Die Klasse TestedClass.main() hat regulär eine IOException geworfen, und in ihr befand sich die exit()-Anweisung auch nicht. Aber in ihr wurde eine weitere Klasse aufgerufen, in welcher die IO-werfende Zeile von einem Try-Catch-Block umgeben war. Sobald dieser Block die IO aufgefangen hat, wurde sie auf der Konsole ausgegeben und die JVM beendet.

Sorry, Maki, für das unnötige Beanspruchen deiner Zeit und danke für die Hilfe.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F JUnit unter Ant Allgemeine Java-Themen 3
Zrebna Wieso sind eigentlich JUnit-Tests in src/test/java platziert - nur Konvention? Allgemeine Java-Themen 7
harrytut Java Input/Output Tests Junit Allgemeine Java-Themen 3
B Junit Test Allgemeine Java-Themen 8
J Junit surefire: enrich test information Allgemeine Java-Themen 0
J Junit start surefire for manual testing Allgemeine Java-Themen 1
P No JUnit tests found Allgemeine Java-Themen 5
F Junit Test + Cucumber - JSON auslesen und in einem weiteren Schritt nutzen Allgemeine Java-Themen 0
J JUnit - Auslassen von Code Allgemeine Java-Themen 25
S Zugriff auf jUnit Test Suite Runner-Instanzen innerhalb von Test Classes Allgemeine Java-Themen 7
S Eclipse Probleme beim Implementieren / Ausführen von jUnit 5-Test Suites Allgemeine Java-Themen 14
S Parametrisierte jUnit 5-Tests mit eigenen Datentypen/Klassen-Objekten als Test-Parameter Allgemeine Java-Themen 0
K Input/Output JUnit: Log Inhalte, falsche Assertion Allgemeine Java-Themen 2
H OOP Testen einer Exception mit JUnit Allgemeine Java-Themen 8
AssELAss Junit-Tests für SQL-Veribindung sowie SQL-Queries? Allgemeine Java-Themen 3
O Maven - JUnit - H2 Allgemeine Java-Themen 1
M Selenium JUnit Tests (Auswahl von Testmethoden auswerten) Allgemeine Java-Themen 5
C JUNIT - ANT - build.xml Allgemeine Java-Themen 0
Airwolf89 JUnit: Vorschläge/ Best Practice Allgemeine Java-Themen 7
M JUnit Serverseitig? Wie geht sowas? Allgemeine Java-Themen 2
E JUnit wie Testergebnisse pro Test ("Test Report") erhalten? Allgemeine Java-Themen 1
B JUnit Zufalls Operation testen Allgemeine Java-Themen 1
P JUnit Allgemeine Java-Themen 2
B jUnit 4: Wie protokolliert man Testergebnisse? Allgemeine Java-Themen 1
H JUnit Fehler beim Compilieren - erledigt Allgemeine Java-Themen 0
M JUnit Test Suites Allgemeine Java-Themen 2
L JUnit - automatisiertes vs. manuelles Testen? Allgemeine Java-Themen 6
B Hilfe bei JUnit Test Allgemeine Java-Themen 1
M JUnit & Multithreading - sehr seltener Fehler Allgemeine Java-Themen 3
A JUnit/Hashcode Problem Allgemeine Java-Themen 5
X Problem mit URLClassLoader und JUnit Allgemeine Java-Themen 3
N JUnit Allgemeine Java-Themen 13
M Junit Tests durchführen Allgemeine Java-Themen 18
M JVM Probleme JUnit Allgemeine Java-Themen 2
G NUnit Features in JUnit Allgemeine Java-Themen 2
darekkay (JUnit) Testdaten generieren - Framework? Allgemeine Java-Themen 2
A JUnit problem Allgemeine Java-Themen 9
T Organisation von Junit Testfällen? Allgemeine Java-Themen 2
M JUnit Tests vs. DBUnit Tests Allgemeine Java-Themen 3
P Klassen Junit test funktioniert nicht... Allgemeine Java-Themen 11
S Die Zeile die JUnit gerade ausführt lesen Allgemeine Java-Themen 15
aze JUnit: Testen ob bestimmte Exception nicht auftritt Allgemeine Java-Themen 18
U Fehler: Hauptklasse org.junit.runner.JUnitCore konnte nicht gefunden oder geladen werden Allgemeine Java-Themen 2
G JUnit Test Methoden in anderen Thread verlagern Allgemeine Java-Themen 4
J JUnit-Tests Zeichensatzproblem ? Allgemeine Java-Themen 2
J JUnit, TestCase vs "einfacher" Test Allgemeine Java-Themen 3
S [JUnit] Name von TestCase bekommen Allgemeine Java-Themen 4
1 JUnit Test Suit Allgemeine Java-Themen 2
T Junit-Tests in Java Klasse ausführen Allgemeine Java-Themen 26
J JUnit - werfen von Exceptions testen Allgemeine Java-Themen 17
M JUnit TestSuite erstellen Allgemeine Java-Themen 2
B JUnit und mehrere Instanzen der selben Applikation Allgemeine Java-Themen 4
G Testcases mit Junit auf private-Methode Allgemeine Java-Themen 7
G Input/Output System.in "umbiegen" für junit-Test Allgemeine Java-Themen 4
C JUnit und das Zulassen von RuntimeExceptions Allgemeine Java-Themen 5
ruutaiokwu junit mit annotations geht nicht? Allgemeine Java-Themen 5
T JUnit-Log auslesen Allgemeine Java-Themen 13
C JUnit Tests Allgemeine Java-Themen 4
fastjack JUnit Supplementary Classes Allgemeine Java-Themen 4
O Junit Reports / Logs als XML ohne Maven/Ant Allgemeine Java-Themen 7
M Junit und Mocks Allgemeine Java-Themen 5
fastjack jUnit und Test von equals, hashCode, toString Allgemeine Java-Themen 11
D junit - frage zu fixtures/test suites Allgemeine Java-Themen 11
A Seltsames Verhalten von JUnit-Tests im Zusammenspiel mit Ant Allgemeine Java-Themen 6
S JUnit: Erzeugen einer IOException Allgemeine Java-Themen 9
G JUnit Tests Allgemeine Java-Themen 7
G JUnit Test Allgemeine Java-Themen 5
S JUnit - was mocken, was nicht? Allgemeine Java-Themen 3
S JUnit TesSuite und @Repeat Allgemeine Java-Themen 2
S JUnit Tests für GUI / Oberflächen Allgemeine Java-Themen 2
M Junit und Mocks bei JDBC Daos Allgemeine Java-Themen 8
M JUnit Problem mit AssertionFailedError Allgemeine Java-Themen 2
B Testfälle mit JUnit Allgemeine Java-Themen 4
S JUnit Allgemeine Java-Themen 15
N ClassNotFound Exception bei JUnit Test? Allgemeine Java-Themen 2
G ANT Tutorial . Schritte bzgl. Junit Bibliothek Allgemeine Java-Themen 4
A JUnit Reports zu groß für XSLT Allgemeine Java-Themen 4
M JUnit und dynamische Tests Allgemeine Java-Themen 11
GilbertGrape Warum schlägt JUnit-Test fehl? Allgemeine Java-Themen 19
K Bekomme JUnit TEst nicht zum laufen :( Allgemeine Java-Themen 9
K Junit: Frage zum Ablauf Allgemeine Java-Themen 3
K JUnit: Tests über ant aufrufen Allgemeine Java-Themen 2
S JUnit und EasyMock Allgemeine Java-Themen 7
B Wie alt ist JUnit? Allgemeine Java-Themen 2
A Junit Exceptions testen Allgemeine Java-Themen 3
P Testen mit JUnit Allgemeine Java-Themen 8
7 JUnit: Testproblem. Allgemeine Java-Themen 23
G Ant + JUnit Allgemeine Java-Themen 2
S Integer zu int konvertieren - JUnit Allgemeine Java-Themen 12
G testen mit JUnit? Allgemeine Java-Themen 3
K JUnit 4 User Interaktion Allgemeine Java-Themen 7
M Ant + Junit + Testclass in Jar Allgemeine Java-Themen 3
G Junit 4 - TestSuite Allgemeine Java-Themen 6
B JUnit Allgemeine Java-Themen 2
T CheckStyle, JUnit und FindBugs aus Java-Programm starten Allgemeine Java-Themen 2
S JUnit will ins Netz! Allgemeine Java-Themen 2
B JUnit - Gleichen Test x-mal durchlaufen Allgemeine Java-Themen 2
F Hilfe: Adjazenzmatrix mittels JUnit testen. Allgemeine Java-Themen 2
H JUnit Allgemeine Java-Themen 5
N Problem mit Ant und JUnit Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben