Introduction à AssertJ

Introduction à AssertJ

1. Overview

Dans cet article, nous exploreronsAssertJ - une bibliothèque open source basée sur la communauté utilisée pour écrire des assertions fluides et riches dans les tests Java.

Cet article se concentre sur les outils disponibles dans le module de base AssertJ appeléAssertJ-core.

2. Maven Dependencies

Pour utiliser AssertJ, vous devez inclure la section suivante dans votre fichierpom.xml:


    org.assertj
    assertj-core
    3.4.1
    test

Cette dépendance ne couvre que les assertions Java de base. Si vous souhaitez utiliser des assertions avancées, vous devrez ajouter des modules supplémentaires séparément.

Notez que pour Java 7 et les versions antérieures, vous devez utiliser AssertJ Core version 2.x.x.

Les dernières versions peuvent être trouvéeshere.

3. introduction

AssertJ fournit un ensemble de classes et de méthodes utilitaires nous permettant d’écrire facilement de belles assertions fluides pour:

  • Java standard

  • Java 8

  • Goyave

  • Joda Time

  • Neo4J et

  • Composants Swing

Une liste détaillée de tous les modules est disponible sur leswebsite du projet.

Commençons par quelques exemples, tirés directement de la documentation d'AssertJ:

assertThat(frodo)
  .isNotEqualTo(sauron)
  .isIn(fellowshipOfTheRing);

assertThat(frodo.getName())
  .startsWith("Fro")
  .endsWith("do")
  .isEqualToIgnoringCase("frodo");

assertThat(fellowshipOfTheRing)
  .hasSize(9)
  .contains(frodo, sam)
  .doesNotContain(sauron);

Les exemples ci-dessus ne sont que la partie visible de l'iceberg, mais donnez-nous un aperçu de la façon dont vous écrivez des assertions avec cette bibliothèque.

4. AssertJ in Action

Dans cette section, nous allons nous concentrer sur la configuration d'AssertJ et explorer ses possibilités.

4.1. Commencer

Avec le fichier jar de la bibliothèque sur un chemin de classe, l'activation d'assertions est aussi simple que d'ajouter une importation statique unique à votre classe de test:

import static org.assertj.core.api.Assertions.*;

4.2. Rédaction d'assertions

Afin d'écrire une assertion, vous devez toujours commencer par passer votre objet à la méthodeAssertions.assertThat(), puis vous devez suivre les assertions réelles.

Il est important de se rappeler que contrairement à d’autres bibliothèques, le code ci-dessous n’affirme encore rien et fera échouernever à un test:

assertThat(anyRefenceOrValue);

Si vous tirez parti des fonctionnalités de complétion de code de votre IDE, écrire des assertions AssertJ devient incroyablement facile en raison de ses méthodes très descriptives. Voici à quoi cela ressemble dans IntelliJ IDEA 16:

IDE’s code completion features

Fonctionnalités de complétion de code de l'IDE

 

Comme vous pouvez le voir, vous avez le choix entre des dizaines de méthodes contextuelles et celles-ci ne sont disponibles que pour le typeString. Explorons en détail certaines de ces API et examinons certaines assertions spécifiques.

Assertions4.3. Object

LesObjects peuvent être comparés de différentes manières, soit pour déterminer l'égalité de deux objets, soit pour examiner les champs d'un objet.

Examinons deux façons de comparer l'égalité de deux objets. Étant donné les deux objetsDog suivantsfido etfidosClone:

public class Dog {
    private String name;
    private Float weight;

    // standard getters and setters
}

Dog fido = new Dog("Fido", 5.25);

Dog fidosClone = new Dog("Fido", 5.25);

Nous pouvons comparer l'égalité avec l'affirmation suivante:

assertThat(fido).isEqualTo(fidosClone);

Cela échouera carisEqualTo() compare les références d'objet. Si nous voulons plutôt comparer leur contenu, nous pouvons utiliserisEqualToComparingFieldByFieldRecursively() comme ceci:

assertThat(fido).isEqualToComparingFieldByFieldRecursively(fidosClone);

Fido etfidosClone sont égaux lors de l'exécution d'un champ récursif par comparaison de champ car chaque champ d'un objet est comparé au champ de l'autre objet.

Il existe de nombreuses autres méthodes d'assertion qui offrent différentes façons de comparer et de contracter des objets, ainsi que d'examiner et d'affirmer leurs champs. Pour les découvrir tous, reportez-vous auxAbstractObjectAssertdocumentation officiels.

Assertions4.4. Boolean

Quelques méthodes simples existent pour tester la vérité:

  • est vrai()

  • c'est faux()

Voyons-les en action:

assertThat("".isEmpty()).isTrue();

Assertions4.5. Iterable/Array

Pour unIterable ou unArray, il existe plusieurs façons d'affirmer que leur contenu existe. L'une des assertions les plus courantes serait de vérifier si unIterable ouArray contient un élément donné:

List list = Arrays.asList("1", "2", "3");

assertThat(list).contains("1");

ou si unList n'est pas vide:

assertThat(list).isNotEmpty();

ou si unList commence par un caractère donné. Par exemple "1":

assertThat(list).startsWith("1");

Gardez à l'esprit que si vous souhaitez créer plusieurs assertions pour le même objet, vous pouvez les joindre facilement.

Voici un exemple d'assertion qui vérifie si une liste fournie n'est pas vide, contient l'élément "1", ne contient pas de valeur null et contient une séquence d'éléments "2", "3":

assertThat(list)
  .isNotEmpty()
  .contains("1")
  .doesNotContainNull()
  .containsSequence("2", "3");

Bien entendu, il existe de nombreuses autres assertions possibles pour ces types. Pour les découvrir tous, reportez-vous auxAbstractIterableAssertdocumentation officiels.

Assertions4.6. Character

Les assertions pour les types de caractères impliquent principalement des comparaisons et même la vérification si un caractère donné provient d'une tableUnicode.

Voici un exemple d’assertion qui vérifie si un caractère fourni n’est pas un "a", est dans la table Unicode, est supérieur à "b" et est en minuscule:

assertThat(someCharacter)
  .isNotEqualTo('a')
  .inUnicode()
  .isGreaterThanOrEqualTo('b')
  .isLowerCase();

Pour une liste détaillée des assertions de tous les types de caractères, voirAbstractCharacterAssertdocumentation.

Assertions4.7. Class

Les assertions pour le typeClass concernent principalement la vérification de ses champs, les typesClass, la présence d'annotations et la finalité de la classe.

Si vous voulez affirmer que la classeRunnable est une interface, vous devez simplement écrire:

assertThat(Runnable.class).isInterface();

ou si vous voulez vérifier si une classe est assignable de l'autre:

assertThat(Exception.class).isAssignableFrom(NoSuchElementException.class);

Toutes les assertions possibles deClass peuvent être visualisées dans lesAbstractClassAssertdocumentation.

Assertions4.8. File

Les assertions deFile consistent uniquement à vérifier si une instance deFile donnée existe, est un répertoire ou un fichier, a un certain contenu, est lisible ou a une extension donnée.

Vous pouvez voir ici un exemple d'assertion qui vérifie si un fichier donné existe, est un fichier et non un répertoire, peut être lisible et inscriptible:

 assertThat(someFile)
   .exists()
   .isFile()
   .canRead()
   .canWrite();

Toutes les assertions de classe possibles peuvent être visualisées dans lesAbstractFileAssertdocumentation.

Assertions4.9. Double/Float/Integer

Double/Float/Integer et autres typesNumber

Les assertions numériques consistent à comparer des valeurs numériques à l'intérieur ou à l'extérieur d'un décalage donné. Par exemple, si vous voulez vérifier si deux valeurs sont égales selon une précision donnée, nous pouvons procéder comme suit:

assertThat(5.1).isEqualTo(5, withPrecision(1d));

Notez que nous utilisons la méthode d'aidewithPrecision(Double offset) déjà importée pour générer des objetsOffset.

Pour plus d'assertions, visitez AbstractDoubleAssertdocumentation.

Assertions4.10. InputStream

Il n'y a qu'une seule assertion spécifique àInputStream disponible:

  • hasSameContentAs (InputStream attendu)

et en action:

assertThat(given).hasSameContentAs(expected);

Assertions4.11. Map

Les assertionsMap vous permettent de vérifier si une mappe contient une certaine entrée, un ensemble d'entrées ou des clés / valeurs séparément.

Et ici vous pouvez voir un exemple d'assertions qui vérifie si une carte donnée n'est pas vide, contient la touche numérique «2», ne contient pas la touche numérique «10» et contient l'entrée:key: 2, value: “a”:

assertThat(map)
  .isNotEmpty()
  .containsKey(2)
  .doesNotContainKeys(10)
  .contains(entry(2, "a"));

Pour plus d'assertions, voirAbstractMapAssertdocumentation.

Assertions4.12. Throwable

Les assertions deThrowable permettent par exemple: d’inspecter les messages d’exception, les traces de pile, la vérification de cause ou la vérification si une exception a déjà été levée.

Jetons un œil à l'exemple d'une assertion qui vérifie si une exception donnée a été levée et a un message se terminant par «c»:

assertThat(ex).hasNoCause().hasMessageEndingWith("c");

Pour plus d'assertions, consultez AbstractThrowableAssertdocumentation.

5. Décrire les assertions

Pour atteindre un niveau de verbosité encore plus élevé, vous pouvez créer des descriptions personnalisées générées dynamiquement pour vos assertions. La clé pour cela est la méthodeas(String description, Object… args).

Si vous définissez votre assertion comme ceci:

assertThat(person.getAge())
  .as("%s's age should be equal to 100", person.getName())
  .isEqualTo(100);

Voici ce que vous obtiendrez lors de l'exécution des tests:

[Alex's age should be equal to 100] expected:<100> but was:(34)

6. Java 8

AssertJ tire pleinement parti des fonctionnalités de programmation fonctionnelle de Java 8. Plongeons dans un exemple et voyons-le en action. Voyons d'abord comment nous procédons dans Java 7:

assertThat(fellowshipOfTheRing)
  .filteredOn("race", HOBBIT)
  .containsOnly(sam, frodo, pippin, merry);

Nous filtrons ici une collection sur la race Hobbit et nous pouvons faire quelque chose comme ceci en Java 8:

assertThat(fellowshipOfTheRing)
  .filteredOn(character -> character.getRace().equals(HOBBIT))
  .containsOnly(sam, frodo, pippin, merry);

Nous explorerons les capacités Java8 d'AssertJ dans un prochain article de cette série. Les exemples ci-dessus sont tirés deswebsite d'AssertJ.

7. Conclusion

Dans cet article, nous avons brièvement exploré les possibilités offertes par AssertJ, ainsi que les assertions les plus populaires pour les types Java fondamentaux.

L'implémentation de tous les exemples et extraits de code peut être trouvée dans unGitHub project.