É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 Person
s 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
?
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;
}
}
À mon humble avis, c'est beaucoup plus lisible:
people.forEach(person -> Assert.assertThat(person.getGender()), Is.is("male"));