Hvordan hevder du at et bestemt unntak er kastet i JUnit 4-tester?

Hvordan kan jeg bruke JUnit4 idiomatisk for å teste at noe kode kaster et unntak?

Selv om jeg absolutt kan gjøre noe som dette:

@Test
public void testFooThrowsIndexOutOfBoundsException() {
  boolean thrown = false;

  try {
    foo.doStuff();
  } catch (IndexOutOfBoundsException e) {
    thrown = true;
  }

  assertTrue(thrown);
}

Jeg husker at det er en kommentar eller en Assert.xyz eller noe som er langt mindre klønete og langt mer i ånden til JUnit for slike situasjoner.

Løsning

JUnit 4 har støtte for dette:

@Test(expected = IndexOutOfBoundsException.class)
public void testIndexOutOfBoundsException() {

    ArrayList emptyList = new ArrayList();
    Object o = emptyList.get(0);

}

Referanse:

Kommentarer (16)

Hva med dette: Fang et veldig generelt unntak, sørg for at det kommer ut av fangstblokken, og påstå deretter at klassen til unntaket er det du forventer at det skal være. Denne assert vil mislykkes hvis a) unntaket er av feil type (f.eks. hvis du fikk en Null Pointer i stedet) og b) unntaket aldri ble kastet.

public void testFooThrowsIndexOutOfBoundsException() {
  Throwable e = null;

  try {
    foo.doStuff();
  } catch (Throwable ex) {
    e = ex;
  }

  assertTrue(e instanceof IndexOutOfBoundsException);
}
Kommentarer (3)

JUnit har innebygd støtte for dette, med et "expected" attributt.

Kommentarer (0)