2010-10-06 7 views

risposta

93

Alcuni casi in cui ho trovato utile:

  • contrassegnare un test che è incompleta, in modo che non riesce e si avverte fino a quando si può finirlo
  • assicurandosi viene generata un'eccezione:
try{ 
    // do stuff... 
    fail("Exception not thrown"); 
}catch(Exception e){ 
    assertTrue(e.hasSomeFlag()); 
} 

Nota:

Dal JUnit4, c'è un modo più elegante per testare che un'eccezione viene gettata: usare l'annotazione @Test(expected=IndexOutOfBoundsException.class)

Tuttavia, questo non funzionerà se anche vuoi controllare l'eccezione, quindi hai ancora bisogno di fail().

+2

Considera questo post sul blog sui meriti relativi dell'annotazione rispetto a quella prevista: http://blog.jooq.org/2016/01/20/use-junits-expected-exceptions-sparingly/ – lbalazscs

+0

@sleske "se vuoi anche ispezionare l'eccezione, quindi è ancora necessario fail() "- No. ExpectedException è il modo in cui, vedere https://github.com/junit-team/junit4/wiki/exception-testing – kraxor

+0

@kraxor: Vero, non lo sapevo quando ho scritto la risposta (probabilmente non era nemmeno intorno poi). – sleske

6

Penso che il caso di utilizzo normale sia quello di chiamarlo quando nessuna eccezione è stata lanciata in un test negativo.

Qualcosa come il seguente pseudo-codice:

test_addNilThrowsNullPointerException() 
{ 
    try { 
     foo.add(NIL);      // we expect a NullPointerException here 
     fail("No NullPointerException"); // cause the test to fail if we reach this    
    } catch (NullNullPointerException e) { 
     // OK got the expected exception 
    } 
} 
+2

Se non si controlla qualcosa nel blocco catch, è possibile utilizzare l'annotazione del metodo @ExpectedException (NullNullPointerException.class) per dichiarare che si prevede un'eccezione (di un tipo speciale). – FrVaBe

9

Diciamo che si sta scrivendo un banco di prova per un flusso ve in cui il codice in fase di sperimentazione dovrebbe sollevare un'eccezione

try{ 
    bizMethod(badData); 
    fail(); // FAIL when no exception is thrown 
} catch (BizException e) { 
    assert(e.errorCode == THE_ERROR_CODE_U_R_LOOKING_FOR) 
} 
2

Questo è come io uso il metodo Fail.

ci sono tre stati che il tuo caso di test può finire in

  1. Superato: la funzione in prova eseguita con successo e restituito dati come previsto
  2. non passato: la funzione in prova eseguita con successo, ma la dati restituiti non era come previsto
  3. Impossibile: La funzione non è stata eseguita con successo e questo non era

previsti (a differenza dei casi di test negativi che prevedono un'eccezione a ).

Se si utilizza eclissi, tre stati sono indicati rispettivamente da un indicatore verde, blu e rosso.

Uso l'operazione di errore per il terzo scenario.

ad es. : public Integer add (intero a, Integer b) {return new Integer (a.intValue() + b.intValue())}

  1. Superato il caso: a = new interger (1), b = new Integer (2) e la funzione restituito 3
  2. caso non passato: a = new interger (1), b = new Integer (2) e la funzione ha restituito valore soem diverso da 3
  3. caso riuscito: a = null, b = null e la funzione lancia una NullPointerException
+0

Se si guarda il codice sorgente di JUnit, si vedrà che le asserzioni usano 'fail()'. –

6

ho usato nel caso in cui qualcosa potrebbe essere andato storto nel mio metodo @Before.

public Object obj; 

@Before 
public void setUp() { 
    // Do some set up 
    obj = new Object(); 
} 

@Test 
public void testObjectManipulation() { 
    if(obj == null) { 
     fail("obj should not be null"); 
    } 

    // Do some other valuable testing 
} 
+0

Sì, la verifica delle precondizioni è buona. Tuttavia, se vuoi assicurarti che il metodo '@ Before' abbia successo, probabilmente è meglio controllarlo direttamente in quel metodo. Come bonus, almeno JUnit e TestNG riportano anche un errore diverso per errori dai metodi '@ Before' /' @ After', quindi si può vedere che il problema non era nel test stesso. – sleske

1

Io, per esempio, utilizzare fail() indicare prove che non sono ancora finiti (succede); altrimenti, mostrerebbero il successo.

Questo è forse dovuto al fatto che non sono a conoscenza di una sorta di funzionalità incomplete(), che esiste in NUnit.

4

utilizzare semplicemente:

org.junit.Assert.fail("Exception expected"); 
0

Il caso d'uso più importante è probabilmente la verifica un'eccezione.

Mentre junit4 include expected element per verificare se si è verificata un'eccezione, sembra che non faccia parte della più recente junit5. Un altro vantaggio dell'utilizzo di fail() su expected è che è possibile combinarlo con finally consentendo la pulizia del caso di test.

dao.insert(obj); 
try { 
    dao.insert(obj); 
    fail("No DuplicateKeyException thrown."); 
} catch (DuplicateKeyException e) { 
    assertEquals("Error code doesn't match", 123, e.getErrorCode()); 
} finally { 
    //cleanup 
    dao.delete(obj); 
} 

Come indicato in un altro commento. Avere un test per fallire fino a quando non è possibile completare l'implementazione sembra ragionevole.

Problemi correlati