2016-05-07 21 views
7

Junit's @BeforeClass i @AfterClass muszą być zadeklarowane jako statyczne. Istnieje ładne obejście here dla @BeforeClass. Mam wiele testów jednostkowych w mojej klasie i chcę tylko raz zainicjować i wyczyścić. Każda pomoc, jak uzyskać obejście dla @AfterClass? Chciałbym używać Junit bez wprowadzania dodatkowych zależności. Dzięki!Junit @AfterClass (nie statyczny)

+1

Co powstrzymuje Cię od używania metod statycznych do skonfigurowania i zerwania? To prawda, że ​​ustawiony stan musiał zostać przeniesiony do pól statycznych, ale brzmi to tak, jakby chciał on mieć zasięg statyczny. –

+0

Zapisz instancję testową w polu "static". Wejdź do niego w swojej metodzie '@ AfterClass' i poproś o wywołanie dowolnej metody czyszczenia. –

+0

Istnieją inne klasy, które uzyskują dostęp do tej samej metody czyszczenia, która wymaga różnych zakresów. – jamesw1234

Odpowiedz

0

Jeśli chcesz czegoś podobnego do obejścia opisanego dla @BeforeClass, możesz śledzić, ile testów zostało przeprowadzonych, a następnie, po wykonaniu wszystkich testów, w końcu wykonaj końcowy kod oczyszczania.

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... 
    } 
    } 
} 

Zakłada używasz JUnit 4. Jeśli trzeba uwzględnić metod odziedziczonych z nadklasy, zobacz this jak to rozwiązanie nie zostanie odziedziczone metody.

+0

to może działać w prostych przypadkach, ale nie zadziała, jeśli testy zostaną zignorowane, lub w testach dziedziczonych – dkatzel

+0

@dkatzel Dobra uwaga. Można również iterować poprzez odziedziczone metody, wykonując coś w stylu [to] (https://stackoverflow.com/questions/28400408/what-is-the-new-way-of-getting-all-metods-of-a- class-included-inherited-defau). Najlepiej jest zachować zasoby, które powinny być czyszczone tylko raz jako statyczne i dbać o to podczas '@ AfterClass'. – kingkupps