2010-05-21 10 views
35

je tente d'exécuter un test JUnit à partir d'une classe Java avec:arguments de ligne de commande Pass pour le cas de test JUnit en cours d'exécution par programme

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

problème est mon test JUnit nécessite une connexion de base de données qui est actuellement codé en dur dans le JUnit test lui-même. Ce que je cherche est un moyen d'exécuter le test JUnit par programme (ci-dessus) mais de lui passer une connexion de base de données que je crée dans ma classe Java qui exécute le test, et non codé en dur dans la 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 sais sur le paramètres @, mais il ne semble pas applicable ici car il est plus pour exécuter le même test cas plusieurs fois avec des valeurs différentes. Je souhaite que tous mes cas de test partagent une connexion de base de données que je transmette via un fichier de configuration à mon client 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 façon étrange de faire les choses.

Répondre

41

Vous pouvez utiliser les propriétés du système java pour cela.

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 le définir 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 basés sur cette propriété, en attendant de savoir si vous souhaitez exécuter l'installation une fois pour chaque test (auquel cas vous pouvez utiliser des membres de classe) ou une fois pour chaque suite (et ensuite utiliser des membres statiques).

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

+0

Les méthodes System.set/getProperty() étaient suffisantes pour transmettre des variables aux classes de test en cours d'exécution. Je vous remercie! –

+0

Si vous passez des arguments de cette façon -Dconnectionstring = foobar. Comment pouvez-vous les extraire en cours d'exécution? –

+1

@TomKoptel vous obtenez la valeur en utilisant quelque chose comme 'String value = System.getProperty (" connectionstring ");' – tonio