hasProperty
可以与hasItem
一起使用以检查给定属性的值,例如:
Matcher hasName = Matchers<Person>hasProperty("name", is("Winkleburger"));
assertThat(names, hasItem(hasName));
当name是一个属性时,这很好,即:有一个名为
getName()
的方法。是否有一个匹配器将检查不是属性的方法?即:
在这种情况下,它将检查集合中的项目
name()
而不是getName()
的返回值。 最佳答案
您可以为此使用另一个内置的Hamcrest,即FeatureMatcher。这些设计用于在将您的输入转换为其他内容后与其他匹配器组合。因此,在您的情况下,您将执行以下操作:
@Test
public void test1() {
List<Person> names = new ArrayList<>();
names.add(new Person("Bob"));
names.add(new Person("i"));
assertThat(names, hasItem(name(equalTo("Winkleburger"))));
}
private FeatureMatcher<Person, String> name(Matcher<String> matcher) {
return new FeatureMatcher<Person, String>(matcher, "name", "name") {
@Override
protected String featureValueOf(Person actual) {
return actual.name();
}
};
}
与自定义匹配器相比,您将获得的好处是它可以与其他匹配器完全重用和组合,因为它所做的只是数据提取,然后顺应您想要的任何其他匹配器。您还将获得适当的诊断信息,例如在上面的示例中,如果将断言更改为不存在的值,您将收到:
java.lang.AssertionError:
Expected: a collection containing name "Batman"
but: name was "Bob", name was "Winkleburger"
关于java - Hamcrest匹配器,用于检查集合中方法的返回值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25646266/