2011-03-24 7 views
5

Mi piacerebbe fare un po 'di "cose ​​proprie" quando un'asserzione in JUnit fallisce. Mi piacerebbe avere questo:Intercettazione di JUnit Funzioni di asserzione

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

Naturalmente, questo non funziona, perché non è possibile eseguire l'override metodi statici. Ma se lo fosse, sarebbe bello, perché ogni funzione di asserzione come assertTrue() chiama il metodo fail(). Quindi, potrei facilmente intercettare ogni affermazione.

Esiste un modo per fare ciò che voglio fare qui, senza implementare tutti i diversi sapori di assert...?

risposta

1

È possibile scrivere una classe che implementa esattamente le stesse firme di tutti i metodi in Assert e quindi delega ai metodi 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); 
    } 
} 

Non esattamente re-implementazione di tutti i metodi, ma comunque noioso. Il tuo IDE potrebbe essere in grado di aiutare a generare i metodi dei delegati.

3

Si dovrebbe dare un'occhiata alle regole, che sono state introdotte in Junit 4.7. Soprattutto TestWatchman:

TestWatchman è una classe base per Regole che prendono atto dell'azione di test, senza modificarla. Ad esempio, questa classe non mancherà di tenere un registro di ogni test di passaggio e non riuscendo:

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

Esso consente di definire un MethodRule in grado di gestire non superano le prove (Copia dal 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() { 
    } 

come da commento TestWatchman è depecreated in recenti versioni di JUnit e sostituito con TestWatcher (ma la funzionalità è la stessa):

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

+2

TestWatchman sembra essere stato deprecato in favore di TestWatcher. (Link sopra è rotto) –

0

Per le asserzioni individuali puoi prendere l'AssertionError - il seguente funziona per me. È utile quando ti occorrono solo occasionalmente.

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