Come posso usare JUnit4 in modo idiomatico per testare che un certo codice lanci un'eccezione?
Mentre posso certamente fare qualcosa come questo
@Test
public void testFooThrowsIndexOutOfBoundsException() {
boolean thrown = false;
try {
foo.doStuff();
} catch (IndexOutOfBoundsException e) {
thrown = true;
}
assertTrue(thrown);
}
Ricordo che c'è un'annotazione o un Assert.xyz o qualcosa che è molto meno kludgy e molto più nello spirito di JUnit per questo tipo di situazioni.
JUnit 4
ha un supporto per questo:
@Test(expected = IndexOutOfBoundsException.class)
public void testIndexOutOfBoundsException() {
ArrayList emptyList = new ArrayList();
Object o = emptyList.get(0);
}
Riferimento :
Che ne dite di questo: Cattura un'eccezione molto generica, assicurati che esca dal blocco di cattura, poi asserisci che la classe dell'eccezione è quella che ti aspetti che sia. Questa asserzione fallirà se a) l'eccezione è del tipo sbagliato (ad esempio se si ottiene un puntatore nullo) e b) l'eccezione non è mai stata lanciata.
public void testFooThrowsIndexOutOfBoundsException() {
Throwable e = null;
try {
foo.doStuff();
} catch (Throwable ex) {
e = ex;
}
assertTrue(e instanceof IndexOutOfBoundsException);
}