Zugriff auf jUnit Test Suite Runner-Instanzen innerhalb von Test Classes

SlitEye

Mitglied
Hallo Zusammen,

ich habe folgende Test Suite-Klasse:
Java:
package TestSuite.Dummy;
//...some imports...

@RunWith(ParameterizedSuite.class)
@SuiteClasses({
T5.class
})
public class TestSuite_Dummy_01
{
    public static Object[] parameters = new Object[] {"A", "B", "C"};

    @Parameters(name = "Parameter of suite are {0}")
    public static Object[] params() throws NoSuchMethodException, SecurityException
    {
       System.out.println(parameters.length);
       System.out.println(parameters.getClass().getTypeName());

       return parameters;
    }

    @Parameter(0)
    public static String myStringParameter;

    public static ISHQA QAE = null;

    public static ISHQA getISHQA()
    {
       // Create a new ISHQA object
       try
       {
           QAE = new ISHQA();
           System.out.println("QAE created");
           return QAE;
       }
       catch(MalformedURLException e)
       {
           e.printStackTrace();
           return null;
       }
    }

    public static String getParameter()
    {
       System.out.println("Parameter available?" + ParameterContext.isParameterSet());
       return myStringParameter;
    }
}

und folgene Beispiel-Testklasse, welche die Test Suite am Beispiel 3x ausführt:
Java:
package Main.Demo;
//...some imports...

@RunWith(JUnitPlatform.class) //is necessary to run jUnit 5 tests with non-junit5-implemented IDEs
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@ExtendWith(ClientDescriptionParameterResolver.class)
public class T5
{  
    public static ISHQA QAE;
    public static String parameters;

    public T5()
    {
        //...
    }

    @BeforeAll
    static void setUpBeforeClass() throws Exception
    {
        QAE = TestSuite_Dummy_01.getISHQA();
        parameters = TestSuite_Dummy_01.getParameter();
        System.out.println("Parameters from Suite: " + parameters);
    }

    @Test
    public void test01(ClientDescription client)
    {
        //...
    }

    //...
}

Die Test Suite parametrisiere ich durch den speziellen jUnit 4 runner com.github.peterwippermann.junit4.parameterizedsuite.ParameterizedSuite.class und das funktioniert auch. Sofern ich bei den Testklassen den zugehörigen Parameterized.class runner verwende, kann ich auch innerhalb der Testklassen auf die Parameter zugreifen. Da ich für künftige jUnit tests (insb. 5er) den JUnitPlatform.class runner nehmen muss/möchte, komme ich in der Testklasse so ohne weiteres nicht mehr an die Parameter. Daher habe ich in der Test Suite-Klasse eine getParameter()-Funktion erzeugt, welche ich in den Testklassen nutzen kann, z.B. über diese Zeile:
Java:
//...
parameters = TestSuite_Dummy_01.getParameter();
//...
was auch wunderbar funktioniert. Allerdings funktioniert dies nur mit der einen fest angegebenen Test Suite-Klasse. Es soll aber mit jeder gerade ausführenden Test Suite-Klasse funktionieren.

Daher möchte ich gerne innerhalb der Testklasse die gerade ausführende Test Suite Runner-Instanz zurückgeben und nutzen lassen, etwa so:
Java:
//...
TestSuite suite = this.getRunnerInstanceSuite();
parameters = suite .getParameter();
//...

Nur wie? Ich habe viel probiert und viel im Internet recherchiert, aber nichts gefunden.
Habt Ihr einen Lösungsansatz oder gar die Lösung hierfür?

Vielen Dank im Voraus.

VG

DITTY
 
Ich würde ein ThreadLocal verwenden.

Dies erlaubt eine Art Wurmloch, das Senden von Daten über Lib-Aufrufe, denen man keine zusätzlichen Parameter mitgeben kann.
 
Magst Du mir ein Beispiel-Code vorgeben, damit ich auf das Objekt "public static ISHQA QAE" der TestSuite innerhalb der TestClass via ThreadLocal zugreifen kann? So richtig hab ich die Anwendung davon noch nicht verstanden.
 
Aktuell ist es doch schon static und damit von überall zugreifbar, mit ThreadLocal kannst du den Zugriff auf den aktuellen Thread begrenzen.
Wenn ich das richtig sehe, ist das aber nicht das, was du braucht - das static, was du aktuell schon hast, ist dir ja zu wenig?
 
leider ja, weil ich so in den Testklassen wie am Beispiel oben immer nur einen fixen Bezug zu einer TestSuite habe:
Java:
        QAE = TestSuite_Dummy_01.getISHQA();
        parameters = TestSuite_Dummy_01.getParameter();
Hier also am Beispiel der TestSuite TestSuite_Dummy_01.class, wo ich die static-Variablen quasi per Referenz übernehme.

Anforderung ist jedoch, dass dies auch mit mehreren TestSuites funktionieren soll.
 
*Möglicherweise* kann man da mit Extensions und Stores etwas basteln - allerdings weiß ich nicht, ob man damit an die Suite ran kommt
 
Auch in Junit5-Testsuites wird einen before und after-Mechanismus geben.

In Junit4 musste man dafür irgendwo eine Methode hinschreiben und jeweils eine Annotation dran schreiben.

In der before-Methode setzt Du die aktuelle Test-Suite und in der after-Methode entfenrst Diu diese wieder.

Wenn Testsuites von Testsuites aufgerufen werden, solltest Du einen Stack verwenden.
 
Auch in Junit5-Testsuites wird einen before und after-Mechanismus geben.

In Junit4 musste man dafür irgendwo eine Methode hinschreiben und jeweils eine Annotation dran schreiben.

In der before-Methode setzt Du die aktuelle Test-Suite und in der after-Methode entfenrst Diu diese wieder.

Wenn Testsuites von Testsuites aufgerufen werden, solltest Du einen Stack verwenden.
Gibts für Suites eben noch nicht - gibt ja noch nicht mal richtigen Suite-Support.
 

Zurück
Oben