2012-05-10 94 views
5

Ho scritto un semplice RunListener per JUnit che funziona abbastanza bene con Maven. Potrei registrarlo per il plugin Maven-failsafe viaCome posso utilizzare JUnit RunListener in Eclipse?

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

e vedere l'output corretto dall'ascoltatore.

Ora voglio registrare lo stesso RunListener in Eclipse per vedere la stessa uscita lì, quando ho eseguito il test.

È possibile? A scopo di test e per coerenza, sarebbe bello avere lo stesso risultato.

risposta

1

Sì, è possibile. Fondamentalmente è necessario implementare il proprio Runner e all'interno del metodo run, è possibile aggiungere un listener di esecuzione personalizzato. Ho pensato che questo sulla base di this post, punto 2.

Ecco il mio ascoltatore

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

ed ecco la mia 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); 
    } 
} 

ed ecco il mio test JUnit attuale

@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); 
    } 
}  

È possibile eseguire MyTest1 o il metodo Test1 utilizzando il menu di scelta rapida in Eclipse e invocherà il testLogger come ti aspetteresti.

+1

Questo non è esattamente quello che ho cercato, perché non mi piace aumentare la complessità dell'implementazione del test per la registrazione. Volevo aggiungere la registrazione al di fuori dei test, ma la soluzione è la migliore finora e il risultato alla fine è come desiderato. Segnalo questa risposta come la soluzione. –

0

Ho fatto un po 'più di reseatrch su questo. Per quanto posso ora vedere, non c'è modo di aggiungere un ascoltatore di run anche JUnit eseguito in Eclipse.

+1

Sono estremamente deluso da questo. –

2

Ho una serie di test che hanno bisogno di un database per essere eseguito. Voglio creare il database all'inizio della loro esecuzione e rimuoverlo alla fine.

Da Maven ho anche aggiunto un RunListener al plugin maven-surefire e funziona correttamente. E ho anche aggiunto una variabile di proprietà di sistema denominata ismaven. Quando eseguo il test da parte di Maven, questa variabile viene inizializzata ma quando eseguo i test da Eclipse, questa variabile è null (accesso alla variabile con System.getProperty).

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

Tutti i miei test di database ereditare da una classe che ha un @BeforeClass e un metodi @AfterClass. Questi metodi controllano se il test viene eseguito da Maven o da Eclipse controllando il valore della proprietà ismaven. Se il test viene eseguito da Maven, la proprietà ismaven ha un valore e fanno qualsiasi cosa. Ma è il test viene eseguito dal Eclipse, la variabile ismaven è nullo e si avvia (@BeforeClass) o si ferma (@AfterClass) il database:

@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(); 
    } 
} 

Questa soluzione non risolve il 100% la vostra problema ma se lo si implementa è possibile eseguire (ed eseguire il debug) tutti i test di una classe JUnit utilizzando Eclipse e si possono anche eseguire tutti i test del progetto usando Maven con la garanzia che si eseguirà una volta un pezzo di codice prima o dopo l'esecuzione di tutti i tuoi test.

Problemi correlati