2016-05-07 28 views
7

Junit @BeforeClass e @AfterClass devono essere dichiarati statici. C'è una soluzione alternativa here per @BeforeClass. Ho un numero di test unitari nella mia classe e desidero solo inizializzarlo e ripulirlo una volta. Qualsiasi aiuto su come ottenere una soluzione alternativa per @AfterClass? Mi piacerebbe usare Junit senza introdurre ulteriori dipendenze. Grazie!Junit @AfterClass (non statico)

+1

Che cosa ti impedisce di utilizzare metodi statici per impostare e rimuovere? È vero, lo stato che hai impostato dovrebbe essere spostato su campi statici, ma sembra che tu voglia avere un ambito statico. –

+0

Salva l'istanza di prova in un campo 'static'. Accedilo nel tuo metodo '@ AfterClass' e invoca qualsiasi metodo di pulizia che desideri. –

+0

Ci sono altre classi che accedono allo stesso metodo di ripulitura che richiede ambiti diversi – jamesw1234

risposta

0

Se si desidera qualcosa di simile alla soluzione menzionata per @BeforeClass, è possibile tenere traccia di quanti test sono stati eseguiti, quindi una volta eseguiti tutti i test, infine, eseguire il codice di pulizia finale.

public class MyTestClass { 
    // ... 
    private static int totalTests; 
    private int testsRan; 
    // ... 

    @BeforeClass 
    public static void beforeClass() { 
    totalTests = 0; 
    Method[] methods = MyTestClass.class.getMethods(); 
    for (Method method : methods) { 
     if (method.getAnnotation(Test.class) != null) { 
     totalTests++; 
     } 
    } 
    } 

    // test cases... 

    @After 
    public void after() { 
    testsRan++; 
    if (testsRan == totalTests) { 
     // One time clean up code here... 
    } 
    } 
} 

Questo presuppone che si sta utilizzando JUnit 4. Se è necessario tenere conto di metodi ereditati da una superclasse, vedi this come questa soluzione non venga metodi ereditati.

+0

questo potrebbe funzionare in casi semplici ma non funzionerà se i test vengono ignorati, o in test ereditati – dkatzel

+0

@dkatzel Buon punto. Puoi anche scorrere i metodi ereditati facendo qualcosa come [this] (https://stackoverflow.com/questions/28400408/what-is-the-new-way-of-getting-all-methods-of-a- class-compresi-ereditato-Sottotito). Probabilmente è meglio mantenere le risorse che dovrebbero essere ripulite solo una volta come statiche e occuparsene durante '@ AfterClass'. – kingkupps