2012-05-10 7 views
5

Ich habe einen einfachen RunListener für JUnit geschrieben, der mit Maven recht gut funktioniert. Ich konnte es für die überWie kann ich einen JUnit RunListener in Eclipse verwenden?

<properties> 
    <property> 
     <name>listener</name> 
     <value>com.asml.lcp.middleware.common.jboss.test.tps.TestDocumentationListener</value> 
    </property> 
</properties> 

Maven-Fail-safe-Plugin registrieren und die korrekte Ausgabe vom Hörer sehen.

Jetzt möchte ich den gleichen RunListener in Eclipse zu sehen, um die gleiche Ausgabe dort zu sehen, wenn ich die Tests ausführen.

Ist das möglich? Für Testzwecke und um konsistent zu sein, wäre es schön, die gleiche Ausgabe zu haben.

Antwort

1

Ja, es ist möglich. Grundsätzlich müssen Sie Ihren eigenen Runner implementieren und innerhalb der Run-Methode können Sie einen benutzerdefinierten Run-Listener hinzufügen. Ich dachte, diese basierend auf this post, Punkt 2.

Hier ist mein Zuhörer

public class TestLogger extends RunListener 
{ 
    public void testFinished(Description description) 
    { 
     System.out.println("Successful " + description.getMethodName()); 
    } 
} 

und hier ist mein Runner

public class TestRunner extends BlockJUnit4ClassRunner 
{ 
    public TestRunner(Class<?> klass) throws InitializationError 
    { 
     super(klass); 
    } 

    @Override 
    public void run(RunNotifier notifier) 
    { 
     notifier.addListener(new TestLogger()); // THIS IS THE IMPORTANT LINE 
     super.run(notifier); 
    } 
} 

und hier ist mein eigentlicher JUnit-Test

@RunWith(TestRunner.class)   // THIS LINE IS ALSO IMPORTANT 
public class MyTest1 
{ 
    @Test 
    public void Test1() throws Exception 
    { 
     if (Math.random() < .5) throw new Exception("ouch"); 
     assertFalse(Math.random() < .5); 
    } 
}  

Sie können MyTest1 oder die Test1-Methode über das Kontextmenü in Eclipse ausführen und es wird aufgerufen der testLogger, wie Sie es erwarten würden.

+1

Dies ist nicht genau das, was ich gesucht habe, weil ich nicht die Komplexität der Test-Implementierung für die Protokollierung erhöhen möchte. Ich wollte die Protokollierung außerhalb der Tests hinzufügen, aber die Lösung ist die beste bisher und das Ergebnis am Ende ist wie gewünscht. Ich markiere diese Antwort als Lösung. –

0

Ich habe ein wenig mehr resatrach auf diesem. Soweit ich es jetzt sehen kann, gibt es keine Möglichkeit, einen Run-Listener hinzuzufügen, auch wenn JUnit in Eclipse läuft.

+1

Ich bin sehr enttäuscht von diesem. –

2

Ich habe eine Reihe von Tests, die eine Datenbank ausführen müssen. Ich möchte die Datenbank zu Beginn ihrer Ausführung erstellen und am Ende entfernen.

Von Maven habe ich auch eine RunListener zum Maven-Surefire-Plugin hinzugefügt und es funktioniert gut. Und ich habe auch eine Systemeigenschaftsvariable mit dem Namen ismaven hinzugefügt. Wenn ich den Test von maven ausführe, wird diese Variable initialisiert, aber wenn ich die Tests von Eclipse aus führe, ist diese Variable null (ich greife auf die Variable mit System.getProperty zu).

<configuration> 
    <properties> 
    <property> 
     <name>listener</name> 
     <value>com.mycompany.MyRunListener</value> 
    </property> 
    </properties> 
    <systemPropertyVariables> 
    <ismaven>true</ismaven> 
    </systemPropertyVariables> 
</configuration> 

Alle meine Datenbank Tests erben von einer Klasse, die eine @BeforeClass und eine @AfterClass Methoden hat. Diese Methoden überprüfen, ob der Test von Maven ausgeführt wird oder ob Eclipse den Wert der Eigenschaft ismaven überprüft. Wenn der Test von Maven ausgeführt wird, hat die ismaven Eigenschaft einen Wert und sie tun alles. Aber wird der Test von der Eclipse ausgeführt wird, die ismaven Variable ist null und sie beginnt (@BeforeClass) oder stoppt (@AfterClass) die Datenbank:

@BeforeClass 
public static void checkIfStartDatabase() { 
    String ismaven = System.getProperty("ismaven"); 
    // If it is not maven, start the database 
    if (ismaven == null) { 
    startDatabase(); 
    } 
} 

@AfterClass 
public static void checkIfStopDatabase() { 
    String ismaven = System.getProperty("ismaven"); 
    // If it is not maven, stop the database 
    if (ismaven == null) { 
    stopDatabase(); 
    } 
} 

Diese Lösung 100% nicht lösen Ihre Problem, aber wenn Sie es implementieren, können Sie alle Tests einer JUnit-Klasse mit dem Eclipse ausführen (und debuggen) und Sie können auch alle Tests Ihres Projekts mit Maven mit der Garantie ausführen, dass Sie einmal ein Stück Code vor oder ausführen werden nach der Durchführung all Ihrer Tests.

Verwandte Themen