2010-05-21 2 views
35

Ich versuche, mit einem JUnit-Test aus einer Java-Klasse ausgeführt wird:Pass Befehlszeilenargumente zu JUnit-Testfall werden ausgeführt programmatisch

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

Problem ist mein JUnit-Test erfordert eine Datenbankverbindung, die derzeit in der fest einprogrammiert wird JUnit Test selbst.

Was ich suche ist eine Möglichkeit, den JUnit-Test programmgesteuert (oben) auszuführen, aber eine Datenbankverbindung zu übergeben, die ich in meiner Java-Klasse erstellen, die den Test ausführt, und nicht innerhalb der JUnit-Klasse fest codiert.

Im Grunde so etwas wie

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

Dann im 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); 
} 

Ich weiß um die @Parameter, aber es scheint hier nicht anwendbar, da es mehr für den Betrieb den gleichen Tests ist Fall mehrfach mit unterschiedlichen Werten. Ich möchte, dass alle meine Testfälle eine Datenbankverbindung teilen, die ich über eine Konfigurationsdatei an meinen Java-Client übergebe, der dann diese Testfälle ausführt (die auch über die Konfigurationsdatei übertragen werden).

Ist das möglich?

P.S. Ich verstehe, dass dies eine seltsame Art ist, Dinge zu tun.

Antwort

41

Sie können Java-Systemeigenschaften verwenden, um dies zu erreichen. geben

einfach, was Sie mit -Dconnectionstring=foobar im junit Kommandozeile benötigen, oder den Java-API verwenden, um Systemeigenschaften diesen programmatisch zu setzen, mit System.setProperty(String name, String value) und System.getProperty(String name).

In Ihren Tests, können Sie die @Before oder @BeforeClass einzurichten gemeinsame Objekte auf der Grundlage dieser Eigenschaft nutzen, auf anhängige, ob Sie das Setup einmal für jeden Test (in diesem Fall können die Teilnehmer verwenden) oder einmal ausführen für jede Suite (und verwenden Sie dann statische Mitglieder).

Sie können dieses Verhalten sogar faktorisieren, indem Sie eine abstrakte Klasse verwenden, die alle Ihre Testfälle erweitert.

+0

Die Methoden System.set/getProperty() waren ausreichend, um Variablen an die laufenden Testklassen zu übergeben. Vielen Dank! –

+0

Wenn Sie Argumente auf diese Weise übergeben -Docverbstring = foobar. Wie können Sie sie in Laufzeit extrahieren? –

+1

@TomKoptel Sie erhalten den Wert mit etwas wie 'String value = System.getProperty (" connectionstring ");' – tonio