[JUnit] Name von TestCase bekommen

specialize

Bekanntes Mitglied
Grüß euch,

habe ein GUI für meinen Test Runner geschrieben.
Ab JUnit 4 gibts die möglichkeit mittels mehreren @Test 's einen "Multi" Testcase zu erstellen.
Dabei will ich von allen Tests darin den Namen auslesen, wenn der Test positiv ausfällt (negativ hab ichs mit dem Result -> getFailures) leicht gelöst.

Da ich allerdings mit der alten TestSuite arbeite und nicht mit der neuen Suite, schaffe ich es nicht daraus den Namen des Tests im "Multi"Test herauszufinden.
Aufgrund der fehlenden Methoden .addTestCase() und .addTestSuite() kann ich auch nicht umsteigen.

Mein derzeitiger Lösungsvorschlag ist es, den Test zu einem TestCase zu konvertieren (casten?), allerdings funktioniert es nicht so wie ich will:

Java:
s1 = new TestSuite();
			String suiteToRun = new String(tf_runts.getText());	
			sTR = Class.forName(suiteToRun);		

TestCase tc1 = (TestCase)sTR; // Funktioniert nicht



Class<? extends TestCase> ctc1 = (Class<? extends TestCase>)sTR; // Funktioniert

Allerdings habe ich jetzt bei ctc keine Methoden von TestCase vererbt.
Wie komme ich an diese?

Bzw. hat jemand eine bessere Lösung?

Wenn ein Test fehlschlägt bekomme ich den Namen der Methode so:
Java:
Result jTRES = new Result();

ta_cmd.setText(ta_cmd.getText()+"\n"+"#"+ jTRES.getRunCount()+": " + jTRES.getFailures().get(jTRES.getFailureCount()-1).getDescription().getTestClass().getName()+" [ "+JjTRES.getFailures().get(jTRES.getFailureCount()-1).getDescription().getMethodName()+" ] "+" - "+"Failure - "+jTRES.getFailures().get(jTRES.getFailureCount()-1).getMessage());
 
Zuletzt bearbeitet:
> (Class<? extends TestCase>)

es gibt generell keinen generischen Cast, innerhalb der Cast-Klammern kann man immer auf <> verzichen,
evtl. Warnungen zu unsicherem generischen Benehmen gibts so oder so

-------

ansonsten ist das ganze etwas unklar,
was ist denn jetzt sTR bei deinem Ablauf ganz konkret? entweder die Klasse erbt von TestCase oder nicht,
Annotations und Methodennamen oder was immer du da beschreibst spielen keine Rolle

außerdem versuchst du sTR erst auf TestCase, dann auf Class zu casten, was denn nun?
die Java-Klasse Class erbst eindeutig nicht von TestCase..

> sTR = Class.forName(suiteToRun);

ok, es ist also eine Klasse, du schreibst ja auch dass diese Zeile funktioniert

> habe ich jetzt bei ctc keine Methoden von TestCase vererbt.
meinst du ctc1, dass Class-Objekt? ein Objekt der Klasse Class hat auch nur Class-Methoden, keine TestCase-Methoden,

vielleicht möchtest du ein Objekt dieser Klasse mit newInstance() erzeugen?
das könntest du dann auch auf TestCase casten, falls die ominöse unbekannte Klasse von TestCase erbt
 
vielleicht möchtest du ein Objekt dieser Klasse mit newInstance() erzeugen?
das könntest du dann auch auf TestCase casten, falls die ominöse unbekannte Klasse von TestCase erbt

Ok, danke ja so könnte es gehen >TestCase.getName() Allerdings müsse ich dann den Testname der Testklasse bei jeder Testmethode ändern.

Deshalb ist die Lösung bzw. mein Vorgeschlagener Lösungsweg noch etwas "suboptimal".


Nochmal das Szenario möglichst einfach Beschrieben, hoffe verständlich:


Ich hab eine Suite, bestehend aus TestCases.
Einer dieser TestCases besteht aus mehreren TestMethoden.
Nun will ich den Namen dieser TestMethoden bekommen.

Externe Klasse zum starten der Suite:
Der Suite Name wird über ein Textfeld eingelesen und dann wird die Suite gestartet.



Wie mache ich das?
 
Zuletzt bearbeitet:
generell gibt es Reflection um an Methodennamen beliebiger Klassen zu kommen,
da kann man bestimmt auch Annotations lesen, falls das dein Kriterium für die Methoden ist

siehe etwa
Using Java Reflection
ab 'Finding Out About Methods of a Class'
wobei dort noch nichts über Annotations steht, aber man kann ja nachschlagen was die Klasse Method so bietet,
oder genauer im Internet suchen
 
ja new instance od reflection sind auch super ideen, wohlmöglich die besten die bisher meinen wissensstand erreicht haben.

die herrausforderung ist, dass man im internet eig rein gar nicht viel über das schreiben eines eigenen runners inkl. environment findet weil es ja die IDEs gibt.

Gerade ausprobiert:
New Instance + casten hat nicht funktoniert,
dafür reflection!


€: Gelöst mittels Reflection, Danke!
 
Zuletzt bearbeitet:

Zurück
Oben