AssertJ Exception Assertions

AssertJ Exception Assertions

1. Vue d'ensemble

Dans ce rapide didacticiel, nous allons examiner les assertions dédiées aux exceptions deAssertJ’s.

2. Sans AssertJ

Afin de tester si une exception a été levée, nous devons intercepter l'exception, puis effectuer des assertions:

try {
    // ...
} catch (Exception e) {
    // assertions
}

Mais que se passe-t-il si aucune exception n'est levée? Dans ce cas, le test réussirait; c'est pourquoi il est nécessaire d'échouer manuellement les cas de test.

3. Avec AssertJ

En utilisant Java 8, nous pouvons facilement faire des assertions sur les exceptions, en utilisant les expressions AssertJ et lambda.

3.1. Utilisation deassertThatThrownBy()

Vérifions si l'indexation d'un élément hors limites dans une liste lève unIndexOutOfBoundsException:

assertThatThrownBy(() -> {
    List list = Arrays.asList("String one", "String two"));
    list(2);
}).isInstanceOf(IndexOutOfBoundsException.class)
  .hasMessageContaining("Index: 2, Size: 2");

Notez comment le fragment de code qui peut lever une exception est passé en tant qu'expression lambda.

Bien entendu, nous pouvons utiliser diverses assertions AssertJ standard, telles que:

.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. Utilisation deassertThatExceptionOfType

L'idée est similaire à l'exemple ci-dessus, mais nous pouvons spécifier le type d'exception au début:

assertThatExceptionOfType(IndexOutOfBoundsException.class)
  .isThrownBy(() -> {
      // ...
}).hasMessageMatching("Index: \\d+, Size: \\d+");

3.3. Utilisation deassertThatIOException et d'autres types courants

AssertJ fournit des wrappers pour les types d'exceptions courants tels que:

assertThatIOException().isThrownBy(() -> {
    // ...
});

Et pareillement:

  • assertThatIllegalArgumentException ()

  • assertThatIllegalStateException ()

  • assertThatIOException ()

  • assertThatNullPointerException ()

3.4. Séparer l'exception de l'assertion

Une autre façon d'écrire nos tests unitaires estwriting the when and then logic in separate sections:

// when
Throwable thrown = catchThrowable(() -> {
    // ...
});

// then
assertThat(thrown)
  .isInstanceOf(ArithmeticException.class)
  .hasMessageContaining("/ by zero");

4. Conclusion

Et nous y sommes. Dans ce court article, nous avons discuté dedifferent ways to use AssertJ for performing assertions on exceptions.

Comme toujours, le code relatif à cet article est disponibleover on Github.