2012-04-19 7 views
32

Ho costruito il mio framework esistente utilizzando Jfunc che fornisce una funzionalità per continuare l'exezione anche quando uno dei test nel caso di test fallisce. Jfunc usa il framework junit 3.x. Ma ora stiamo migrando a junit4 quindi non posso più usare Jfunc e l'ho sostituito con junit 4.10 jar.
Ora il problema è che abbiamo utilizzato ampiamente jfunc nel nostro framework e con junit 4 vogliamo rendere il nostro codice continuare l'esecuzione anche quando uno degli asseriti fallisce in un caso di test.
Qualcuno ha qualche suggerimento/idea per questo, so che in junit i test devono essere più atomici, vale a dire uno asserire per test case, ma non possiamo farlo nel nostro framework per qualche motivo.Esecuzione di test continui in junit4 anche quando uno degli asseriti fallisce

risposta

41

È possibile eseguire questa operazione utilizzando una regola ErrorCollector.

Per usarlo, prima aggiungere la regola come un campo nella classe di test:

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

    //...tests... 
} 

Quindi sostituire il vostro afferma con chiamate a collector.checkThat(...).

ad es.

+1

Grazie per la risposta chris. Ha funzionato e ha continuato dopo il primo errore (ad es. Collector.checkThat (10, CoreMatchers.equalTo (11))). Ma il problema è che voglio che contrassegni il test come fallito anche se uno dei controlli fallisce. Attualmente dopo aver eseguito il test precedente, il test viene contrassegnato come superato. Voglio che fallisca e mostri lo stacktrace sulla linea di errore (qualcosa di simile a quando una asserzione fallisce). – user85

+0

È strano. Ho appena provato il codice che ho scritto nella mia risposta, e ha funzionato come previsto. Il test fallisce e stampa la traccia di stack di ogni asserzione fallita. Ecco il codice di prova completo e l'output che ho ottenuto, eseguendo il test da IntelliJ: https://gist.github.com/2419626 –

+0

Oh ... il mio male, ho appena dimenticato di aggiungere la regola e ha causato tutto il caos ..... scusa per la confusione e grazie mille per il post. – user85

8

Uso anche ErrorCollector ma uso anche assertThat e inserirli in un blocco catch try.

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

Utilizzare i blocchi try/finally. Questo ha funzionato nel mio caso:

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

Ti rendi conto che questa domanda è stata postata 2 anni fa e c'è già una risposta accettata? –

+4

@ TheJuniorProgrammer solo una nota generale, questo sito non riguarda solo le risposte accettate. Il punto è aiutare gli utenti che cercano risposte a trovare una soluzione a un problema.A volte ci sono diversi approcci per risolvere un problema, e a volte ciò che funziona per una persona potrebbe non funzionare altrettanto bene per un'altra. – nomistic

+0

@nomistic fine, abbastanza vero. –

Problemi correlati