2010-03-04 44 views
2

我從JUnit開始,並不理解註釋@Test@BeforeClass
我有以下代碼:如何理解@Test&@BeforeClass?

public class Toto { 
@BeforeClass 
    public static void setupOnce() { 
     final Thread thread = new Thread() { 
      public void run() { 
       Main.main(new String[]{"-arg1", "arg2"}); 
      } 
     }; 
     try { 
      thread.start(); 
     } catch (Exception ex) { 
     } 
    } 

爲什麼@BeforeClass?在這種情況下,setupOnce()和線程是什麼?
我們應該在每次Java測試之前添加@Test嗎?
因此,如果我有30個Java測試,我應該在每個Java文件中有@Test public void test()

+1

爲什麼?我無權提問? – user281070

+0

你這樣做,只是不要指望我們任何人都花費很多的時間和精力來回答你的問題,如果你不能花時間閱讀和接受有用的答案。 – Tim

回答

16

@BeforeClass註釋標識了一個方法,該方法應該在此實現單元中包含的任何測試用例之前執行。在這種特殊情況下,此測試類包含一些線程資源的初始化,這些線程資源需要在測試期間在後臺執行。

的JUnit定義了四種生命週期事件:

  • @BeforeClass:之前從類的任何其他測試將被excuted。
  • @Before:在ONE測試運行之前直接執行,對於任何@Test註釋的方法它將被精確調用一次。
  • @Test:測試本身,您可能在應用程序中以這種方式註釋了幾種方法。
  • @之後:執行測試後,不受任何錯誤或失敗的影響。將有幾個執行,一個用於任何@Test註釋的方法。
  • @AfterClass:這個類的任何測試執行後,

在我的應用程序,我通常用註釋的方法@BeforeClass而真正昂貴的,甚至是爲完整的測試只執行一次執行昂貴的初始化整個套房。但這個「事件」是基於一些加速我的發展的黑客。

+0

1)謝謝你,它更多現在清除,但線程呢? 2)在這種情況下,我應該在每個java測試中添加@Test嗎? 3)有沒有一種方法來重新組合一個函數中的所有註釋併爲每個java測試調用它? – user281070

+0

從代碼片段中不清楚,在後臺線程中發生了什麼。但我認爲,有一些服務器像資源,將使用此構造分離出來。 但通常我會期待一些@AfterClass操作加入此線程。 –

+0

在這段代碼中,目標是啓動臨時應用程序,但爲什麼使用這些方法,對我而言並不明確 – user281070