45

我正在尝试从 Java 类运行 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);
}

我知道@Parameters,但它在这里似乎不适用,因为它更适合以不同的值多次运行相同的测试用例。我希望我的所有测试用例共享一个数据库连接,我通过配置文件传递给我的 java 客户端,然后运行这些测试用例(也通过配置文件传递)。

这可能吗?

PS我明白这似乎是一种奇怪的做事方式。

4

1 回答 1

50

您可以使用 java 系统属性来实现这一点。

只需在 junit 命令行中传递您需要的内容-Dconnectionstring=foobar,或使用系统属性的 java api 以编程方式设置它,使用System.setProperty(String name, String value), 和System.getProperty(String name).

In your tests, you can use the @Before or @BeforeClass to set up common objects based on this property, pending on whether you want to run the setup once for each test (in which case you can use class members) or once for each suite (and then use static members).

You can even factorize this behavior by using an abstract class which all your test cases extends.

于 2010-05-21T17:36:10.503 回答