2012-04-19 11 views
32

Tengo mi marco de trabajo existente creado con Jfunc, que proporciona la posibilidad de continuar con la ejecución incluso cuando falla una de las afirmaciones en el caso de prueba. Jfunc usa el framework junit 3.x. Pero ahora estamos migrando a junit4, así que ya no puedo usar Jfunc y lo he reemplazado con junit 4.10 jar.
Ahora el problema es que hemos usado extensamente jfunc en nuestro framework, y con junit 4 queremos que nuestro código continúe la ejecución incluso cuando uno de los argumentos falla en un caso de prueba.
¿Alguien tiene alguna sugerencia/idea para esto, sé que en junio las pruebas deben ser más atómicas, es decir, una afirmación por caso de prueba, pero no podemos hacer eso en nuestro marco por alguna razón.Continuación de la ejecución de la prueba en junit4 incluso cuando una de las afirmaciones falla

Respuesta

41

Puede hacerlo utilizando una regla ErrorCollector.

Para usarlo, primero añadir la regla como un campo en su clase de prueba:

public class MyTest { 
    @Rule 
    public ErrorCollector collector = new ErrorCollector(); 

    //...tests... 
} 

luego vuelva a colocar el afirma con llamadas a collector.checkThat(...).

p. Ej.

@Test 
public void myTest() { 
    collector.checkThat("a", equalTo("b")); 
    collector.checkThat(1, equalTo(2)); 
} 
+1

Gracias por la respuesta a Chris. Funcionó y continuó después de la primera falla (es decir, collector.checkThat (10, CoreMatchers.equalTo (11))). Pero el problema es que lo quiero marcar la prueba como fallida incluso si falla una de las comprobaciones. Actualmente, después de ejecutar la prueba anterior, la prueba se marca como aprobada. Quiero que falle y mostrar la pila en la línea de falla (algo similar a cuando falla una afirmación). – user85

+0

Eso es extraño. Acabo de probar el código que escribí en mi respuesta, y funcionó como se esperaba. La prueba falla e imprime la traza de pila de cada afirmación anómala. Aquí está el código de prueba completo y la salida que obtuve, ejecutando la prueba de IntelliJ: https://gist.github.com/2419626 –

+0

Oh ... es malo, me olvido de agregar la regla y causó todo el caos ... perdón por la confusión y mucho por la publicación. – user85

8

Uso el ErrorCollector también, pero también uso assertThat y colóquelos en un bloque try catch.

import static org.junit.Assert.*; 
import static org.hamcrest.Matchers.*; 

@Rule 
public ErrorCollector collector = new ErrorCollector(); 

@Test 
public void calculatedValueShouldEqualExpected() { 
    try { 
     assertThat(calculatedValue(), is(expected)); 
    } catch (Throwable t) { 
     collector.addError(t); 
     // do something 
    } 
} 
0

Utilice los bloques try/finally. Esto funcionó en mi caso:

... 
try { 
    assert(...) 
} finally { 
    // code to be executed after assert 
} 
... 
+1

¿Te das cuenta de que esta pregunta se publicó hace 2 años y ya hay una respuesta aceptada? –

+4

@TheJuniorProgrammer solo una nota general, este sitio no es solo acerca de las respuestas aceptadas. El objetivo es ayudar a los usuarios que buscan respuestas a encontrar una solución a un problema.A veces hay múltiples enfoques para resolver un problema, y ​​algunas veces lo que funciona para una persona puede no funcionar tan bien para otra. – nomistic

+0

@nomistic bien, es suficiente. –

Cuestiones relacionadas