Assortisseurs de haricots Hamcrest

1. Vue d’ensemble

  • Hamcrest est une bibliothèque qui fournit des méthodes, appelées adaptateurs, permettant aux développeurs d’écrire des tests unitaires plus simples. .

Dans cet article, nous allons explorer les beans matchers.

2. Installer

Pour obtenir Hamcrest, il suffit d’ajouter la dépendance Maven suivante à notre pom.xml :

<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>java-hamcrest</artifactId>
    <version>2.0.0.0</version>
    <scope>test</scope>
</dependency>

La dernière version de Hamcrest est disponible sur Maven Central .

3. Bean Matchers

Les comparateurs de haricots sont extrêmement utiles pour vérifier les conditions sur les POJO , ce qui est fréquemment requis lors de l’écriture de la plupart des tests unitaires.

Avant de commencer, nous allons créer un cours qui nous aidera à travers les exemples:

public class City {
    String name;
    String state;

   //standard constructor, getters and setters

}

Maintenant que nous sommes tous prêts, voyons les matchers de haricots en action!

3.1. apropriété

Ce matcher consiste essentiellement à vérifier si certains beans contiennent une propriété spécifique identifiée par le nom de la propriété _: _

@Test
public void givenACity__whenHasProperty__thenCorrect() {
    City city = new City("San Francisco", "CA");

    assertThat(city, hasProperty("state"));
}

Donc, ce test passera parce que notre bean City a une propriété nommée state.

En suivant cette idée, nous pouvons également vérifier si un bean a certaines propriétés et si ces propriétés ont une certaine valeur:

@Test
public void givenACity__whenHasPropertyWithValueEqualTo__thenCorrect() {
    City city = new City("San Francisco", "CA");

    assertThat(city, hasProperty("name", equalTo("San Francisco")));
}

Comme nous pouvons le constater, hasProperty est surchargé et peut être utilisé avec un second matcher pour vérifier une condition spécifique sur une propriété.

Donc, nous pouvons aussi faire ceci:

@Test
public void givenACity__whenHasPropertyWithValueEqualToIgnoringCase__thenCorrect() {
    City city = new City("San Francisco", "CA");

    assertThat(city, hasProperty("state", equalToIgnoringCase("ca")));
}

Utile, non? Nous pouvons pousser cette idée un peu plus loin avec le matcher que nous explorerons ensuite.

3.2. samePropertyValuesAs

Parfois, lorsque nous devons vérifier plusieurs propriétés d’un bean, il peut être plus simple de créer un nouveau bean avec les valeurs souhaitées ** . Ensuite, nous pouvons vérifier l’égalité entre le bean testé et le nouveau. Hamcrest fournit bien sûr un correcteur pour cette situation:

@Test
public void givenACity__whenSamePropertyValuesAs__thenCorrect() {
    City city = new City("San Francisco", "CA");
    City city2 = new City("San Francisco", "CA");

    assertThat(city, samePropertyValuesAs(city2));
}

Cela se traduit par moins d’assertions et un code plus simple. De la même manière, nous pouvons tester le cas négatif:

@Test
public void givenACity__whenNotSamePropertyValuesAs__thenCorrect() {
    City city = new City("San Francisco", "CA");
    City city2 = new City("Los Angeles", "CA");

    assertThat(city, not(samePropertyValuesAs(city2)));
}

Ensuite, voyez quelques méthodes util pour inspecter les propriétés de classe.

3.3. getPropertyDescriptor

  • Il existe des scénarios où il peut être utile de pouvoir explorer une structure de classe. ** Hamcrest fournit quelques méthodes utiles pour le faire:

@Test
public void givenACity__whenGetPropertyDescriptor__thenCorrect() {
    City city = new City("San Francisco", "CA");
    PropertyDescriptor descriptor = getPropertyDescriptor("state", city);

    assertThat(descriptor
      .getReadMethod()
      .getName(), is(equalTo("getState")));
}
  • L’objet descriptor récupère un grand nombre d’informations sur la propriété state . ** Dans ce cas, nous avons extrait le nom du getter et affirmons qu’il correspond à une valeur attendue. Notez que nous pouvons également appliquer d’autres adaptateurs de texte.

Pour continuer, la dernière méthode que nous explorerons est un cas plus général de cette même idée.

3.4. propertyDescriptorsFor

Cette méthode est fondamentalement la même que celle de la section précédente, mais pour toutes les propriétés du bean ** . Nous devons également spécifier le niveau auquel nous voulons aller dans la hiérarchie de classes:

@Test
public void givenACity__whenGetPropertyDescriptorsFor__thenCorrect() {
    City city = new City("San Francisco", "CA");
    PropertyDescriptor[]descriptors = propertyDescriptorsFor(
      city, Object.class);

    List<String> getters = Arrays.stream(descriptors)
      .map(x -> x.getReadMethod().getName())
      .collect(toList());

    assertThat(getters, containsInAnyOrder("getName", "getState"));
}

Nous avons donc obtenu ce qui suit: obtenez tous les descripteurs de propriété du bean city et arrêtez-vous au niveau Object .

Ensuite, nous avons simplement utilisé les fonctionnalités de Java 8 pour filtrer les méthodes de lecture.

Enfin, nous avons utilisé des correspondeurs de collections pour vérifier quelque chose dans la liste des getters . Vous pouvez trouver plus d’informations sur les correspondeurs de collections ici .

4. Conclusion

Les correspondants Hamcrest sont constitués d’un ensemble d’outils formidables à utiliser dans tous les projets. Ils sont faciles à apprendre et deviennent extrêmement utiles en peu de temps.

  • Les hacheurs de haricots en particulier constituent un moyen efficace de faire des affirmations sur les POJO ** , ce qui est souvent nécessaire lors de la rédaction de tests unitaires.

Pour obtenir la mise en œuvre complète de ces exemples, veuillez vous reporter à le projet GitHub .