2012-05-10 13 views
5

Escribí un RunListener simple para JUnit que funciona bastante bien con Maven. Podría registrarlo para el experto-a prueba de fallos a través de plug-¿Cómo puedo usar un JUnit RunListener en Eclipse?

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

y ver la salida correcta por parte del oyente.

Ahora quiero registrar el mismo RunListener en Eclipse para ver el mismo resultado allí, cuando ejecuto las pruebas.

¿Esto es posible? Para propósitos de prueba y para ser consistente, sería bueno tener el mismo resultado.

Respuesta

1

Sí, es posible. Básicamente, debe implementar su propio Runner y dentro del método de ejecución, puede agregar un escucha de ejecución personalizada. Me di cuenta de esto en base a this post, punto 2.

Aquí está mi oyente

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

y aquí está mi 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); 
    } 
} 

y aquí está mi prueba junit real

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

Puede ejecutar MyTest1 o el método Test1 usando el menú contextual en Eclipse e invocará el testLogger como era de esperar

+1

Esto no es exactamente lo que busqué, porque no me gusta aumentar la complejidad de la implementación de prueba para el registro. Quería agregar el registro fuera de las pruebas, pero la solución es la mejor hasta el momento y el resultado al final es el deseado. Marqué esta respuesta como la solución. –

0

Hice algo más de investigación sobre esto. Por lo que puedo ver ahora, no hay forma de agregar un oyente de ejecución también JUnit se ejecuta en Eclipse.

+1

Estoy extremadamente decepcionado por esto. –

2

Tengo un conjunto de pruebas que necesitan una base de datos para ejecutarse. Quiero crear la base de datos al comienzo de su ejecución y eliminarla al final.

De maven También agregué RunListener al plugin maven-surefire y funciona bien. Y también he agregado una variable de propiedad del sistema llamada ismaven. Cuando ejecuto la prueba desde maven, esta variable se inicializa, pero cuando ejecuto las pruebas desde Eclipse, esta variable es nula (accedo a la variable con System.getProperty).

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

Todos mis pruebas de bases de datos heredan de una clase que tiene un @BeforeClass y un @AfterClass métodos. Estos métodos comprueban si Maven ejecuta la prueba o si Eclipse verifica el valor de la propiedad ismaven. Si maven ejecuta la prueba, la propiedad ismaven tiene un valor y hacen cualquier cosa. Pero es la prueba está siendo ejecutada por el Eclipse, la variable ismaven es nula y que comienza (@BeforeClass) o se detiene (@AfterClass) la base de datos:

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

Esta solución no resuelve el 100% de su problema pero si lo implementa puede ejecutar (y depurar) todas las pruebas de una clase JUnit usando Eclipse y también puede ejecutar todas las pruebas de su proyecto usando Maven con la garantía de que ejecutará una vez un código antes o después de la ejecución de todas tus pruebas.

Cuestiones relacionadas