2010-05-21 32 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