web-dev-qa-db-ja.com

プログラムで実行されるJUnitテストケースにコマンドライン引数を渡す

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クライアントがそれらのテストケースを実行します(構成ファイルを介して渡される)。

これは可能ですか?

追伸これは奇妙なやり方のように思えます。

40
Nick Vallely

これを実現するには、Javaシステムプロパティを使用できます。

Junitコマンドラインで_-Dconnectionstring=foobar_で必要なものを渡すか、システムプロパティにJava apiを使用してSystem.setProperty(String name, String value)およびSystem.getProperty(String name)

テストでは、_@Before_または_@BeforeClass_を使用して、このプロパティに基づいて共通オブジェクトをセットアップできます。テストごとにセットアップを1回実行するかどうかを保留します(この場合、クラスを使用できます)メンバー)またはスイートごとに1回(および静的メンバーを使用)。

すべてのテストケースが拡張する抽象クラスを使用して、この動作を因数分解することもできます。

45
tonio