Risposte:
Alcuni casi in cui l'ho trovato utile:
try{ // do stuff... fail("Exception not thrown"); }catch(Exception e){ assertTrue(e.hasSomeFlag()); }
Nota:
A partire da JUnit4, esiste un modo più elegante per verificare che venga generata un'eccezione: utilizzare l'annotazione @Test(expected=IndexOutOfBoundsException.class)
Tuttavia, questo non funzionerà se vuoi anche ispezionare l'eccezione, quindi hai ancora bisogno fail()
.
Penso che il solito caso d'uso sia chiamarlo quando nessuna eccezione è stata lanciata in un test negativo.
Qualcosa di simile al 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
}
}
L'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
}
@Before
metodo abbia avuto successo, probabilmente è meglio controllarlo direttamente in quel metodo. Come bonus, almeno JUnit e TestNG segnaleranno anche un errore diverso per errori da @Before
/ @After
methods, quindi puoi vedere che il problema non era nel test stesso.
È così che utilizzo il metodo Fail.
Ci sono tre stati in cui può finire il tuo caso di test
previsto (a differenza dei casi di test negativi che prevedono il verificarsi di un'eccezione).
Se stai usando eclipse, tre stati sono indicati rispettivamente da un indicatore verde, blu e rosso.
Uso l'operazione di errore per il terzo scenario.
es: public Integer add (integer a, Integer b) {return new Integer (a.intValue () + b.intValue ())}
fail()
.
Io, ad esempio, uso fail()
per indicare test che non sono ancora finiti (succede); in caso contrario, si dimostrerebbero di successo.
Ciò è forse dovuto al fatto che non sono a conoscenza di una sorta di funzionalità incompleta (), che esiste in NUnit.
Nelle impostazioni simultanee e / o asincrone, potresti voler verificare che alcuni metodi (ad es. Delegati, ascoltatori di eventi, gestori di risposte e così via) non vengano chiamati. Mocking frameworks a parte, puoi chiamarefail()
questi metodi per fallire i test. I timeout scaduti sono un'altra condizione di errore naturale in tali scenari.
Per esempio:
final CountDownLatch latch = new CountDownLatch(1);
service.asyncCall(someParameter, new ResponseHandler<SomeType>() {
@Override
public void onSuccess(SomeType result) {
assertNotNull(result);
// Further test assertions on the result
latch.countDown();
}
@Override
public void onError(Exception e) {
fail(exception.getMessage());
latch.countDown();
}
});
if ( !latch.await(5, TimeUnit.SECONDS) ) {
fail("No response after 5s");
}
Il caso d'uso più importante è probabilmente il controllo delle eccezioni.
Sebbene junit4 includa l' elemento previsto per verificare se si è verificata un'eccezione, sembra che non faccia parte del nuovo junit5. Un altro vantaggio dell'utilizzo di fail()
over the expected
è che puoi combinarlo 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 notato in un altro commento. Anche il fatto che un test fallisca finché non si riesce a completare l'implementazione sembra ragionevole.