web-dev-qa-db-fra.com

Existe-t-il un Hamcrest "pour chaque" Matcher qui affirme que tous les éléments d'une Collection ou Iterable correspondent à un seul Matcher spécifique?

Étant donné un Collection ou Iterable d'éléments, y a-t-il un Matcher (ou une combinaison d'apparieurs) qui affirmera que chaque élément correspond à un seul Matcher?

Par exemple, étant donné ce type d'élément:

public interface Person {
    public String getGender();
}

Je voudrais écrire une affirmation selon laquelle tous les éléments d'une collection de Persons ont une valeur spécifique gender. Je pense à quelque chose comme ça:

Iterable<Person> people = ...;
assertThat(people, each(hasProperty("gender", "Male")));

Existe-t-il un moyen de le faire sans écrire moi-même le matcher each?

50
E-Riz

Utilisez le matcher Every .

import org.hamcrest.beans.HasPropertyWithValue;
import org.hamcrest.core.Every;
import org.hamcrest.core.Is;
import org.junit.Assert;

Assert.assertThat(people, (Every.everyItem(HasPropertyWithValue.hasProperty("gender", Is.is("male")))));

Hamcrest fournit également Matchers#everyItem comme raccourci vers ce Matcher.


Exemple complet

@org.junit.Test
public void method() throws Exception {
    Iterable<Person> people = Arrays.asList(new Person(), new Person());
    Assert.assertThat(people, (Every.everyItem(HasPropertyWithValue.hasProperty("gender", Is.is("male")))));
}

public static class Person {
    String gender = "male";

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }
}
73

À mon humble avis, c'est beaucoup plus lisible:

people.forEach(person -> Assert.assertThat(person.getGender()), Is.is("male"));
1
Markus