Java >> Java tutorial >  >> Tag >> assert

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.


Java tag