是否存在一个"每个"匹配器的Hamcrest,它将一个Collection或Iterable匹配的所有元素断言为一个特定的匹配器?

E-R*_*Riz 54 java hamcrest

给定一个CollectionIterable一个项目,是否有任何Matcher(或匹配的组合)断言每个项目匹配一个Matcher

例如,给定此项目类型:

public interface Person {
    public String getGender();
}
Run Code Online (Sandbox Code Playgroud)

我想写一个断言,Persons 集合中的所有项都有特定的gender值.我在想这样的事情:

Iterable<Person> people = ...;
assertThat(people, each(hasProperty("gender", "Male")));
Run Code Online (Sandbox Code Playgroud)

没有each自己编写匹配器,有没有办法做到这一点?

Sot*_*lis 78

使用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")))));
Run Code Online (Sandbox Code Playgroud)

Hamcrest也提供Matchers#everyItem了快捷方式Matcher.


完整的例子

@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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 为了让它为Java 7编译,我不得不像这样声明hasProperty Matcher:`HasPropertyWithValue.<Person> hasProperty("gender",是("Male"))`这几乎破坏了Hamcrest的可读性改进提供 :-( (2认同)