web-dev-qa-db-ja.com

CollectionまたはIterableのすべての要素が単一の特定のMatcherに一致することをアサートするHamcrest「for each」Matcherはありますか?

アイテムのCollectionまたはIterableが与えられた場合、すべてのアイテムが単一のMatcherと一致することをアサートするMatcher(またはマッチャーの組み合わせ)はありますか?

たとえば、次のアイテムタイプがある場合:

public interface Person {
    public String getGender();
}

Personsのコレクション内のすべてのアイテムに特定のgender値があるという主張を書きたいと思います。私はこのようなことを考えています:

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

eachマッチャーを自分で記述せずにこれを行う方法はありますか?

50
E-Riz

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は Matchers#everyItemMatcherへのショートカットとして。


完全な例

@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

私見これははるかに読みやすいです:

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