2016-05-07 35 views
7

Junit的@BeforeClass@AfterClass必須聲明爲靜態。 @BeforeClass有一個很好的解決方法here。我在課堂上有許多單元測試,只想初始化和清理一次。有關如何獲得@AfterClass解決方法的任何幫助?我想使用Junit而不引入額外的依賴關係。謝謝!Junit @AfterClass(非靜態)

+1

什麼阻止你使用靜態方法建立和拆卸?誠然,你設置的狀態必須移動到靜態字段,但它聽起來像你希望它具有靜態範圍。 –

+0

將測試實例保存在'static'字段中。在你的'@ AfterClass'方法中訪問它,並讓它調用你想要的任何清理方法。 –

+0

還有其他類可以訪問需要不同作用域的相同清理方法 – jamesw1234

回答

0

如果您想要提供類似於@BeforeClass提及的解決方法,您可以跟蹤已經運行了多少測試,然後一旦所有測試運行完畢,最終執行您的結束清理代碼。

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

這裏假設你正在使用JUnit 4,如果您需要考慮從超類繼承的方法,請參閱this因爲這個解決方案沒有得到繼承的方法。

+0

這可能工作在簡單的情況下,但不會工作,如果測試被忽略,或在繼承測試 – dkatzel

+0

@dkatzel好點。你也可以通過執行類似[this]的方法遍歷繼承的方法(https://stackoverflow.com/questions/28400408/what-is-the-new-way-of-getting-all-methods-of-a-類,包括繼承-defau)。最好保留只應該靜態清理一次的資源,並在'@ AfterClass'期間處理它。 – kingkupps