2011-11-28 94 views
6

如果類是由測試套件啓動的,是否有方法知道JUnit 4測試類? 我有全局的東西,我想在所有測試(關於內存數據庫)之前運行,所以我認爲在測試套裝中這樣做。但是,我仍然希望能夠在沒有Test-Suit的情況下一次啓動一個測試,所以我需要知道是否需要在測試的@Before部分初始化全局事物...是否有人知道如果它是可能的 ?測試調用:如何設置所有測試套件共用

回答

5

有幾種方法可以實現這一點。最簡單最簡單的方法是在你的套件的開始和結尾運行一個'測試',它建立你的數據庫,然後設置一個全局標誌。在你的@Before和@After測試中,你檢查這個標誌,如果需要的話進行安裝/拆卸。

@RunWith(Suite.class) 
@SuiteClasses({SetupTest.class, RealTest.class, TeardownTest.class}); 

這是最簡單的解決方案,但它是不是很漂亮,所以一個整潔的解決辦法是使用TestRule。看看延伸ExternalResource。這在圍繞您的測試方法的邏輯之後執行&之前。這將允許您將@Before和@After方法分解出來,以便在任何地方重複使用相同的代碼。

然後,對於您的套件,您還需要在邏輯之前/之後執行。不幸的是,用@RunWith(Suite.class)註解的類實際上並沒有實例化,所以你不能使用該類的構造函數,但是你可以擴展Suite。這取決於你將如何運行這一點,你將需要實現一個構造函數,使用@RunWith爲例:

public class MySuite extends Suite { 
    /** 
    * Called reflectively on classes annotated with <code>@RunWith(Suite.class)</code> 
    * 
    * @param klass the root class 
    * @param builder builds runners for classes in the suite 
    * @throws InitializationError 
    */ 
    public MySuite(Class<?> klass, RunnerBuilder builder) throws InitializationError { 
     this(builder, klass, getAnnotatedClasses(klass)); 
     // put your global setup here 
     // set global variable 
    } 
} 

然後用

@RunWith(MySuite.class) 

運行測試套件有幾個構造函數在不同情況下使用它們,查看每個細節旁邊的註釋。您仍然需要使用全局變量,以便您的規則不會重新執行設置代碼。如果你只想執行設置代碼,執行拆卸代碼會更困難,但是可以完成,上面的代碼可以工作。讓我知道你是否需要它:-)

如果你想要更多的靈活性(說執行設置代碼只爲特定的方法),然後看到我的回答How to define JUnit method rule in a suite?

+0

大多數鏈接都已死亡。 – Nadar

2

我會使用JUnit的@BeforeClass@AfterClass註釋來指示執行此類工作的方法。

從@BeforeClass的Javadoc:

有時幾個測試需要共享計算昂貴的安裝 (如登錄到數據庫)。雖然這可能會影響測試的獨立性,但有時候這是一種必要的優化。 使用@BeforeClass註釋公共靜態void no-arg方法會導致 它會在類中的任何測試方法之前運行一次。超類的@BeforeClass方法將在當前類的 之前運行。

+1

這與一個測試類文件中的幾個帶註釋的@Test方法有關,這不是我正在處理的場景,我需要它來處理幾個測試類。 – stdcall

0

您可以在每個測試套件中放置一些@BeforeClass代碼,它們委託一個輔助類來完成常用的設置。輔助類可以有一個static boolean記錄設置是否已經完成。如果它已經完成,輔助類將什麼都不做。

相關問題