AssertJ Undtagelsespåstande
1. Oversigt
I denne hurtige vejledning vil vi se på AssertJs undtagelsesdedikerede påstande.
2. Uden AssertJ
For at teste, om en undtagelse blev kastet, skal vi fange undtagelsen og derefter udføre påstande:
try {
// ...
} catch (Exception e) {
// assertions
}
Men hvad nu hvis en undtagelse ikke bliver kastet? I så fald ville testen bestå; det er derfor, det er nødvendigt at fejle testcases manuelt.
3. Med AssertJ
Ved at bruge Java 8 kan vi nemt gøre påstande om undtagelser ved at udnytte AssertJ- og lambda-udtryk.
3.1. Brug af assertThatThrownBy()
Lad os kontrollere, om indeksering af et out of bounds-element på en liste giver en IndexOutOfBoundsException:
assertThatThrownBy(() -> {
List<String> list = Arrays.asList("String one", "String two");
list.get(2);
}).isInstanceOf(IndexOutOfBoundsException.class)
.hasMessageContaining("Index: 2, Size: 2");
Bemærk, hvordan kodefragmentet, der kan forårsage en undtagelse, sendes som et lambda-udtryk.
Selvfølgelig kan vi udnytte forskellige standard AssertJ-påstande her som:
.hasMessage("Index: %s, Size: %s", 2, 2)
.hasMessageStartingWith("Index: 2")
.hasMessageContaining("2")
.hasMessageEndingWith("Size: 2")
.hasMessageMatching("Index: \\d+, Size: \\d+")
.hasCauseInstanceOf(IOException.class)
.hasStackTraceContaining("java.io.IOException");
3.2. Brug af assertThatExceptionOfType
Ideen ligner eksemplet ovenfor, men vi kan angive undtagelsestypen i begyndelsen:
assertThatExceptionOfType(IndexOutOfBoundsException.class)
.isThrownBy(() -> {
// ...
}).hasMessageMatching("Index: \\d+, Size: \\d+");
3.3. Brug af assertThatIOException og andre almindelige typer
AssertJ leverer indpakninger til almindelige undtagelsestyper som:
assertThatIOException().isThrownBy(() -> {
// ...
});
Og tilsvarende:
- assertThatIllegalArgumentException()
- assertThatIllegalStateException()
- assertThatIOException()
- assertThatNullPointerException()
3.4. Adskillelse af undtagelsen fra påstanden
En alternativ måde at skrive vores enhedstest på er at skrive hvornår og derefter logik i separate sektioner:
// when
Throwable thrown = catchThrowable(() -> {
// ...
});
// then
assertThat(thrown)
.isInstanceOf(ArithmeticException.class)
.hasMessageContaining("/ by zero");
4. Konklusion
Og der er vi. I denne korte artikel diskuterede vi forskellige måder at bruge AssertJ til at udføre påstande om undtagelser.
Som altid er koden relateret til denne artikel tilgængelig på Github.