Gyakran van szükségünk arra, hogy tesztjeinkben megbizonyosodjunk arról, hogy egy adott metódus bizonyos körülmények között kivételt dobjon. Az ilyen helyzeteket JUnit3-al általában a következő mintával kezeltük:
public class ExpectingExceptionsJunit3 extends TestCase {
public void testExpectedException() throws Exception {
try {
ExceptionThrower.throwIOException();
fail("Exception was expected!");
} catch (IOException e) {
assertEquals("Message of the exception", e.getMessage());
}
}
}
A fenti teszt akkor fut le sikeresen, ha az ExceptionThrower osztály statikus throwIOException() metódusa egy IOException-t dob, melynek a szövege: “Message of the exception”.
public class ExceptionThrower {
public static void throwIOException() throws IOException {
throw new IOException("Message of the exception");
}
}
A JUnit4 megjelenésével a tesztek annotálhatóvá váltak, és a kivételek tesztelése egyszerűbb lett. A @Test annotáció expected paraméterével megadhatjuk az elvárt kivétel típusát:
public class ExpectingExceptionsJunit4 {
@Test(expected = IOException.class)
public void expectedException() throws Exception {
ExceptionThrower.throwIOException();
}
}
Több kollégától is hallottam, hogy ezt a módszert azért nem szeretik használni, mert így csak a kivétel típusát ellenőrizhetjük, a szövegét viszont nem, pedig sokszor arra is szükség van. A JUnit4 4.7-es verziójába bekerült Rule-ok használatával ez is könnyen és elegánsan megoldható. Az ExpectedException szabály alkalmazásával a tesztmetóduson belül adhatjuk meg az elvárt kivétel típusát és szövegét.
public class ExpectingExceptionsJunit4 {
@Rule
public ExpectedException thrown = ExpectedException.none();
@Test
public void expectedException() throws Exception {
thrown.expect(IOException.class);
thrown.expectMessage(is("Message of the exception"));
ExceptionThrower.throwIOException();
}
}
Mint az a fenti példán is látható, létre kell hoznunk egy publikus ExpectedException típusú mezőt @Rule annotációval. Ezután az egyes tesztesetekben beállíthatjuk a várt kivétel típusát, és szövegét. Az expectMessage() metódus paramétere lehet String (ekkor azt ellenőrzi, hogy a kivétel szövege tartalmazza-e a megadott szöveget), vagy Matcher (amivel gyakorlatilag bármit ellenőrizhetünk).


