2012-12-23 32 views
3

我在使用JUnit 4時遇到了一個問題。有一件事讓我非常困惑。 爲什麼下面沒有主要功能,但是它可以被執行並且返回測試結果?它甚至沒有擴展一個類。這樣的代碼如下:代碼如下:java junit沒有主要功能

import org.junit.runner.RunWith;  
import org.junit.runners.Suite;  
import org.junit.runners.Suite.SuiteClasses; 

@RunWith(Suite.class)  
@SuiteClasses({ ATest.class,BTest.class })  
public class AllTests { 

} 

回答

3

主要方法(不是函數)在runner類中實現。 runner類由IDE或構建工具調用,然後運行器加載Test類並執行所有標記的方法(即通過@Test註釋)。

測試的生命週期比主函數稍微複雜一些。 您可以在執行每個@Test之前準備(@BeforeClass和@Before註釋方法),然後進行清理(@After和@AfterClass註釋方法)。

這個框架爲您提供比只有一個主要方法更多的靈活性。也可以單獨運行帶註釋的測試:您可能有一個巨大的測試套件,但您可能希望重複運行一個失敗的測試,同時糾正錯誤;這不能用主要方法來完成(除非你有每個測試的主要方法)。你可以看到,使用像JUnit這樣的框架相對於帶有main的普通Java類有幾個優點。

+0

好的,你是說runner類中的主要方法實際上是由eclipse IDE或builder工具實現的嗎?我想這涉及到一些低級細節。我在哪裏可以看到細節(跑步課程?)?此外,每次測試都會提供「測試」註釋,無論何時我選擇構建,IDE或構建工具都會調用runner類的主要方法,並根據註釋執行測試(單個測試或整個測試套件) , 對?感謝您的詳細解釋! –

+0

否:IDE不執行任何操作。這裏是你正在尋找的主要:https://github.com/KentBeck/junit/blob/master/src/main/java/org/junit/runner/JUnitCore.java 主要方法實際上是一個在Java中的約定用於啓動命令行的程序;一旦IDE通過其main()啓動,它可以直接使用junit功能作爲正常的Java庫訪問其API。另一個例子:運行一個Java小程序,你不需要主要:http://docs.oracle.com/javase/tutorial/deployment/applet/subclass.html'appletviewer'實用程序提供了他自己的主要負載和運行applet init()。 –

+0

呃...我試圖用命令行來運行上面的代碼,它顯示了異常,'線程中的異常'main「java.lang.NoSuchMethodError:main' 因此,Junit與IDE密切相關?如果我想實現一個功能(例如每隔一小時運行一次單元測試,遇到故障,開發人員將收到通知電子郵件),這是否意味着我無法使用上面的代碼? –

0

這是測試跑步者這樣做的角色。您在JUnit < 4中也沒有main()方法。只是JUnit 4跑步者依賴註釋,而JUnit 3跑步者依賴於方法名稱。