2010-05-21 31 views
35

我試圖從一個Java類與運行JUnit測試:傳遞命令行參數的JUnit測試案例被編程方式運行

JUnitCore core = new JUnitCore(); 
    core.addListener(new RunListener()); 
    core.run(classToRun); 

問題是我的JUnit測試要求,目前在硬編碼數據庫連接JUnit測試自己。

我在尋找的是一種以編程方式運行JUnit測試的方法(上圖),但是將一個數據庫連接傳遞給我,我在運行測試的Java類中創建,而不是在JUnit類中進行硬編碼。

基本上類似

JUnitCore core = new JUnitCore(); 
    core.addListener(new RunListener()); 
    core.addParameters(java.sql.Connection); 
    core.run(classToRun); 

然後內classToRun:

@Test 
Public void Test1(Connection dbConnection){ 
    Statement st = dbConnection.createStatement(); 
    ResultSet rs = st.executeQuery("select total from dual"); 
    rs.next(); 
    String myTotal = rs.getString("TOTAL"); 
    //btw my tests are selenium testcases:) 
    selenium.isTextPresent(myTotal); 
} 

我知道的@參數,但它似乎並不適用在這裏,因爲它是更多的運行同樣的測試多次使用不同的值。我希望我的所有測試用例都能共享一個數據庫連接,並通過配置文件傳遞給我的java客戶端,然後運行這些測試用例(也通過配置文件傳入)。

這可能嗎?

P.S.我知道這似乎是一種奇怪的做事方式。

回答

41

您可以使用java系統屬性來實現此目的。

只需在junit命令行中通過-Dconnectionstring=foobar所需的內容即可,或者使用java api作爲系統屬性,以編程方式將其設置爲System.setProperty(String name, String value)System.getProperty(String name)

在您的測試,你可以使用@Before@BeforeClass建立共同的對象基於此屬性,等候您是否要一次爲每個測試運行設置(在這種情況下,你可以使用類成員)或一次爲每個套件(然後使用靜態成員)。

您甚至可以通過使用抽象類將所有測試用例擴展的因素分解。

+0

System.set/getProperty()方法足以將變量傳遞給正在運行的測試類。謝謝! – 2010-05-21 20:00:35

+0

如果以這種方式傳遞參數-Dconnectionstring = foobar。你如何在運行時提取它們? – 2017-01-19 16:10:33

+1

@TomKoptel你可以使用類似'String value = System.getProperty(「connectionstring」);'' – tonio 2017-01-19 18:36:10