Como posso usar o JUnit4 idiomaticamente para testar que algum código lança uma exceção?
Embora eu possa certamente fazer algo assim:
@Test
public void testFooThrowsIndexOutOfBoundsException() {
boolean thrown = false;
try {
foo.doStuff();
} catch (IndexOutOfBoundsException e) {
thrown = true;
}
assertTrue(thrown);
}
Lembro-me que há uma anotação ou um Assert.xyz ou something que é muito menos kludgy e muito mais no espírito da JUnit para este tipo de situações.
A 'JUnit 4' tem suporte para isto:
@Test(expected = IndexOutOfBoundsException.class)
public void testIndexOutOfBoundsException() {
ArrayList emptyList = new ArrayList();
Object o = emptyList.get(0);
}
Referência :
E que tal isto: Apanha uma excepção muito geral, certifica-te que sai do bloco de captura, e depois afirma que a classe da excepção é o que esperas que seja. Esta afirmação falhará se a) a exceção for do tipo errado (por exemplo, se você tiver um Null Pointer em vez disso) e b) a exceção nunca foi jogada.
public void testFooThrowsIndexOutOfBoundsException() {
Throwable e = null;
try {
foo.doStuff();
} catch (Throwable ex) {
e = ex;
}
assertTrue(e instanceof IndexOutOfBoundsException);
}