2008-10-08 11 views
9

Wird eine neue (oder andere) Instanz des TestCase Objekts verwendet, um jede Testmethode in einem JUnit Testfall auszuführen? Oder eine Instanz wird für alle Tests wiederverwendet?JUnit TestCase Objekt Instanziierung

public class MyTest extends TestCase { 
    public void testSomething() { ... } 
    public void testSomethingElse() { ... } 
} 

Während dieser Test ausgeführt wird, wie viele Instanzen MyTest Klasse erstellt?

Wenn möglich, geben Sie einen Link zu einem Dokument oder Quellcode, wo ich das Verhalten verifizieren kann.

Antwort

4

Ich konnte in den JUnit-Dokumenten keine eindeutige Antwort zu Ihrer Frage finden, aber die Absicht, wie anjanb schrieb, ist, dass jeder Test unabhängig von den anderen ist, sodass für jeden Test eine neue TestCase-Instanz erstellt werden konnte ausgeführt werden.

Wenn Sie teuren Testaufbau haben („Befestigungen“), die Sie über alle Testfälle in einer Testklasse geteilt werden wollen, können Sie die @BeforeClass Anmerkung auf einer statische Methode dieses Ergebnis zu erzielen: http://junit.sourceforge.net/javadoc_40/org/junit/BeforeClass.html. Beachten Sie jedoch, dass für jeden Test möglicherweise noch eine neue Instanz erstellt wird, die sich jedoch nicht auf die statischen Daten auswirkt, die Ihre @BeforeTest-Methode initialisiert hat.

+0

@BeforeClass ist in JUnit 3 nicht verfügbar. Ein Äquivalent wird hier beschrieben: http://StackOverflow.com/questions/3023091/does-junit-3-have-etwas-analogous-to-beforeclass –

8

Ja, eine separate Instanz wird erstellt.

Beim Ausführen dieses Tests werden 2 Instanzen von MyTest erstellt. Wenn Sie ein anderes Verhalten wünschen, verwenden Sie ein ähnliches Tool namens TestNG (http://testng.org/doc/).

+0

Danke für die schnelle Antwort. Können Sie auch einen Link zu einem Dokument oder Quellcode angeben, mit dem ich dieses Verhalten überprüfen kann? – Manki

+0

Sie können es leicht überprüfen, indem Sie einen Konstruktor bereitstellen und System.out.println hinzufügen. –

2

Wenn Sie dies fragen, weil Sie Bedenken haben, dass Daten in Ihrem Konstruktor initialisiert und neu initialisiert werden, sollten Sie beachten, dass die Testfalldaten ausschließlich über setUp() und tearDown() initialisiert werden.

3

Es gibt eine Instanz für jeden Testlauf. Versuchen

public class MyTest extends TestCase { 
    public MyTest() { System.out.println("MyTest Constructor"); 
    public void setUp() { System.out.println("MyTest setUp"); 
    public void tearDown() { System.out.println("MyTest tearDown"); 
    public void testSomething() { System.out.println("MyTest testSomething"); 
    public void testSomethingElse() { System.out.println("MyTest testSomethingElse"); 
} 

Der Sourcecode (einschließlich der auf neuere Versionen - Ihr und mein Beispiel ist Junit 3) auf http://www.junit.org

0

Ja, auf jeden Fall. Ich fand, dass Daten, die ich in Instanzvariablen speicherte, aufgrund dieses Entwurfs zwischen den Tests nicht zugegriffen werden konnten.