2009-10-29 4 views
8

Wir haben viele Integrationstests geschrieben mit JUnit , obwohl wir sie jetzt mit 4.4 laufen haben. Einige davon benötigen eine tearDown-Methode, die ausgeführt wird, nachdem alle Tests in der Klasse abgeschlossen wurden (um einige gemeinsame Ressourcen freizugeben).Klasse Teardown in Junit 3?

Ich sehe, dass dies in Junit 4 mit @AfterClass (org.junit) getan werden kann. Das Mischen in vorhandene Junit 3-Tests, die TestCase (junit.framework. *) Erweitern, scheint jedoch nicht zu funktionieren. [BTW gibt es noch ein Migrationstool? Frage 264680 angegeben dort war nicht vor einem Jahr.]

Ich habe erwähnt, junit.extensions.TestSetup für diese Art von Sache zu verwenden. Meine kurze Prüfung davon schien keine Arbeit zu sein. Irgendwelche Beispiele?

+0

Angenommen, wir haben keine Zeit zur Zeit manuell konvertieren und überprüfen alle Tests (und trainieren alle beteiligten Entwickler zur Verwendung des JUnit 4 Anmerkungen), aber Ich möchte nur auf die wenigen Klassen eingehen, die ein AfterClass-Äquivalent in Junit 3 benötigen. –

Antwort

18

Die Antwort auf meine eigene Frage gefunden :) Ich hatte dies kurz versucht, bevor ich meine Frage posten konnte, aber es funktionierte nicht für mich. Aber jetzt ist mir klar, dass unser Testframework junit anders als der Standard aufruft, sodass es nicht die "suite" -Methode aufruft, die in der folgenden Lösung benötigt wird. Wenn ich in Eclipse den gebündelten Junun-Runner verwende, um einen Test/Testfall direkt auszuführen, läuft es gut.

Eine Möglichkeit, dieses Setup/Teardown einmal pro Klasse in Junit 3 durchzuführen, ist die Verwendung von TestSuite. Hier ist ein Beispiel auf junit.org:

Is there a way to make setUp() run only once?

public static Test suite() { 
    return new TestSetup(new TestSuite(YourTestClass.class)) { 

     protected void setUp() throws Exception { 
      System.out.println(" Global setUp "); 
     } 
     protected void tearDown() throws Exception { 
      System.out.println(" Global tearDown "); 
     } 
    }; 
} 
+0

hast du das auf Android ausgeführt? Ich habe den genau gleichen Code, aber ich bekomme eine ClassNotFound-Ausnahme. Ist Ihnen das schon begegnet, erweitert YourTestClass TestCase? –

+0

Ich könnte jetzt meinen Test mit diesem Code ausführen, aber es scheint, dass die Methode suite() nicht aufgerufen wird. Was haben Sie getan, um diese Methode anzurufen? Ich würde es zwar automatisch –

+0

@FelipeMosso nennen, wenn Sie JUnit (oder Ihrer IDE) sagen, eine einzelne JUnit3-style-Testklasse auszuführen, und diese Klasse eine öffentliche static 'suite()' -Methode hat, die einen 'Test' (oder eine Unterklasse) zurückgibt test) dann wird die 'suite()' Methode aufgerufen, um die Suite zu erzeugen. Wenn Sie jedoch manuell Suites selbst erstellen, müssen Sie sicherstellen, dass die Methode suite() verwendet wird (möglicherweise mithilfe des Konstruktors "TestSuite", der eine Klasse akzeptiert). – NamshubWriter

3

In JUnit 4 muss die Testklasse TestCase nicht erweitert werden. Stattdessen müssen Sie sicherstellen, dass der Name Ihrer Testklasse mit *Test übereinstimmt und jede Testmethode mit @Test annotiert ist. Haben Sie versucht, diese Änderungen vorzunehmen und dann die @AfterClass Annotation zu der entsprechenden Methode hinzuzufügen?

Es gibt Anmerkungen zum Ersetzen der meisten/aller Funktionen, die Sie derzeit verwenden können TestCase.

+0

Parallel zu dem Versuch, einen klassenweiten Teardown zu bekommen, versuche ich auch, nur eine Klasse in Junit-4-Annotationen umzuwandeln. Da Eclipse/Command-Line noch nicht viel Glück hat, denke ich, dass ich keine Tests ausführen muss. –

+0

Ich habe meine Antwort aktualisiert, der Ratschlag, den ich zuvor gegeben habe, war völlig falsch und ich verdiene es, in die Hölle entlassen worden zu sein. Bitte folgen Sie den obigen Anweisungen und versuchen Sie es erneut. –