2009-10-29 9 views
8

Abbiamo un sacco di test di integrazione scritti utilizzando JUnit , anche se ora li stiamo eseguendo con 4.4. Alcuni di questi hanno bisogno di un metodo tearDown che viene eseguito dopo che tutti i test della classe sono completi (per liberare alcune risorse comuni).Classe teardown in junit 3?

Vedo che questo può essere fatto in junit 4 con @AfterClass (org.junit). Tuttavia, mescolare questo in junit esistenti 3 test che estendono TestCase (junit.framework. *) Non sembra funzionare. [BTW c'è ancora uno strumento di migrazione? Domanda 264680 indica che non ce n'era uno un anno fa.]

Ho visto menzionare l'uso di junit.extensions.TestSetup per questo genere di cose. Il mio breve test su questo non sembrava funzionare. Qualche esempio?

+0

Si supponga che non abbiamo il tempo attualmente per convertire e verificare tutti i test manualmente (e formare tutti gli sviluppatori coinvolti sull'utilizzo del JUnit 4 annotazioni), ma voglio solo indirizzare le poche classi che richiedono un equivalente AfterClass in junit 3. –

risposta

18

Trovato la risposta alla mia domanda :) Avevo provato questo brevemente prima di postare la mia domanda, ma non funzionava per me. Ma ora mi rendo conto che è perché il nostro framework di test sta invocando junit in modo diverso rispetto a quello predefinito, quindi non stava chiamando il metodo "suite" che è necessario nella seguente soluzione. In Eclipse, se utilizzo il runner junit in bundle per eseguire direttamente un Test/TestCase, funziona perfettamente.

Un modo per eseguire questa installazione/rimozione una volta per classe in junit 3 è utilizzare TestSuite. Ecco un esempio su 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

hai eseguito questo su Android? Ho lo stesso codice ma sto ottenendo un'eccezione ClassNotFound. Hai già affrontato questo problema? YourTestClass estende TestCase? –

+0

Ora potrei eseguire il mio test con questo codice ma sembra che il metodo suite() non venga chiamato. Che cosa hai fatto per fare questa chiamata a questo metodo? Anche se sarebbe chiamato automaticamente –

+0

@FelipeMosso se dirai a JUnit (o al tuo IDE) di eseguire una singola classe di test in stile JUnit3 e quella classe ha un metodo statico pubblico 'suite()' che restituisce un 'Test' (o sottoclasse) di test) verrà chiamato il metodo 'suite()' per generare la suite. Ma se si creano manualmente le suite, è necessario assicurarsi che venga utilizzato il metodo suite() (possibilmente utilizzando il costruttore 'TestSuite' che accetta una classe) – NamshubWriter

3

In JUnit 4, la classe di test non ha bisogno di estendere TestCase. Invece è necessario assicurarsi che il nome della classe di test corrisponda a *Test e ogni metodo di prova sia annotato con @Test. Hai provato a fare queste modifiche, quindi aggiungendo l'annotazione @AfterClass al metodo pertinente?

Ci sono annotazioni per sostituire la maggior parte/tutte le funzionalità che si possono attualmente utilizzare da TestCase.

+0

Parallelamente al tentativo di ottenere un teardown in tutta la classe, sto anche provando a convertire solo una classe in annotazioni junit 4. Non avendo ancora molta fortuna in quanto Eclipse/riga di comando pensa che non ho nessun test da eseguire. –

+0

Ho aggiornato la mia risposta, il consiglio che ho dato in precedenza era completamente sbagliato e mi merito di essere stato svalutato all'inferno. Si prega di seguire le istruzioni sopra e riprovare. –