Kivételek tesztelése JUnit-tal

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).

Nincs hozzászólás Írta:
Kategória: Praktikák
Címkék , , ,

Szólj hozzá!