2011-03-24 19 views
5

Me gustaría hacer algunas "cosas propias" cuando falla una aserción en JUnit. Me gustaría tener esto:Interceptar JUnit Assert functions

public class MyAssert extends org.junit.Assert { 

    // @Override 
    static public void fail(String message) { 
     System.err.println("I am intercepting here!"); 
     org.junit.Assert.fail(message); 
    } 
} 

Por supuesto, esto no funciona, porque no se puede reemplazar los métodos estáticos. Pero si lo hiciera, esto sería bueno, porque cada función afirmar como assertTrue() llama al método fail(). Por lo tanto, podría interceptar fácilmente cada afirmación.

¿Existe en alguna manera de hacer lo que quiero hacer aquí, sin poner en práctica todos los diferentes sabores de assert...?

Respuesta

1

Se podría escribir una clase que implementa exactamente las mismas firmas de todos los métodos en afirmar y luego delega a los métodos Assert.

public class MyAssert { 
    static public void assertTrue(String message, boolean condition) { 
     Assert.assertTrue(message, condition); 
    } 

    ... 

    static public void fail(String message) { 
     System.err.println("I am intercepting here!"); 
     Assert.fail(message); 
    } 
} 

No volviendo a implementar exactamente todos los métodos, pero tedioso no obstante. Su IDE puede ayudarlo a generar los métodos de delegado.

3

debería echar un vistazo a las reglas, que se introdujeron en Junit 4.7. Especialmente TestWatchman:

TestWatchman es una clase base para reglas que tomar nota de la acción de la prueba, sin modificarlo. Por ejemplo, esta clase se mantendrá un registro de cada prueba que pasa y en su defecto:

http://junit-team.github.io/junit/javadoc/4.10/org/junit/rules/TestWatchman.html

Se le permite definir una MethodRule que puede manejar no superen los ensayos (Copiar en el javadoc):

@Rule 
    public MethodRule watchman= new TestWatchman() { 
      @Override 
      public void failed(Throwable e, FrameworkMethod method) { 
        watchedLog+= method.getName() + " " + e.getClass().getSimpleName() 
            + "\n"; 
      } 

      @Override 
      public void succeeded(FrameworkMethod method) { 
        watchedLog+= method.getName() + " " + "success!\n"; 
      } 
    }; 

    @Test 
    public void fails() { 
      fail(); 
    } 

    @Test 
    public void succeeds() { 
    } 

según comentario TestWatchman se depecreated en las nuevas versiones de Junit y se reemplaza con TestWatcher (pero la funcionalidad es la misma):

http://junit-team.github.io/junit/javadoc/4.10/org/junit/rules/TestWatcher.html

+2

TestWatchman parece haber quedado obsoleto a favor de TestWatcher. (El enlace de arriba está roto) –

0

Para aserciones individuales, puede ver AssertionError - las siguientes obras me sirven. Es útil cuando solo necesita la funcionalidad ocasionalmente.

try { 
    Assert.assertEquals("size", classes.length, containerList.size()); 
} catch (AssertionError e) { 
    System.err.println("ERROR"); 
    for (AbstractContainer container : containerList) { 
     System.err.println(container.getClass()); 
    } 
    throw (new RuntimeException("Failed", e)); 
}