web-dev-qa-db-fra.com

Passer des arguments de ligne de commande au scénario de test JUnit exécuté par programme

J'essaie d'exécuter un test JUnit à partir d'une classe Java avec:

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

Le problème est que mon test JUnit nécessite une connexion à la base de données qui est actuellement codée en dur dans le test JUnit lui-même.

Ce que je recherche, c'est un moyen d'exécuter le test JUnit par programme (ci-dessus) mais de lui passer une connexion à une base de données que je crée dans ma classe Java qui exécute le test, et non codée en dur dans le Classe JUnit.

Fondamentalement, quelque chose comme

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

Puis dans le 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);
}

Je connais The @Parameters, mais cela ne semble pas applicable ici car il s'agit davantage d'exécuter plusieurs fois le même scénario de test avec des valeurs différentes. Je veux que tous mes cas de test partagent une connexion de base de données que je transmets via un fichier de configuration à mon Java qui exécute ensuite ces cas de test (également transmis via le fichier de configuration).

Est-ce possible?

P.S. Je comprends que cela semble être une étrange façon de faire les choses.

40
Nick Vallely

Vous pouvez utiliser Java propriétés système pour y parvenir.

Passez simplement ce dont vous avez besoin avec -Dconnectionstring=foobar Dans la ligne de commande junit, ou utilisez l'api Java pour les propriétés système pour définir cela par programme, avec System.setProperty(String name, String value), et System.getProperty(String name).

Dans vos tests, vous pouvez utiliser @Before Ou @BeforeClass Pour configurer des objets communs en fonction de cette propriété, en attendant si vous souhaitez exécuter la configuration une fois pour chaque test (auquel cas vous pouvez utiliser des membres de classe) ou une fois pour chaque suite (puis utiliser des membres statiques).

Vous pouvez même factoriser ce comportement en utilisant une classe abstraite que tous vos cas de test étendent.

45
tonio