将命令行参数传递给以编程方式运行的 JUnit 测试用例

2022-09-01 00:38:24

我正在尝试从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);

然后在类ToRun中:

@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);
}

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

这可能吗?

附言:我知道这似乎是一种奇怪的做事方式。


答案 1

您可以使用 Java 系统属性来实现此目的。

只需在 junit 命令行中传递所需的内容,或使用 java api 作为系统属性,使用 、 和 .-Dconnectionstring=foobarSystem.setProperty(String name, String value)System.getProperty(String name)

在测试中,可以使用 或 基于此属性设置公共对象,这取决于是要为每个测试运行一次安装程序(在这种情况下,可以使用类成员)还是为每个套件运行一次(然后使用静态成员)。@Before@BeforeClass

您甚至可以通过使用所有测试用例扩展的抽象类来分解此行为。


答案 2

推荐