您可以使用另一个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"
因此,您想调用集合中所有项的name()方法吗? – 2014-09-03 14:24:10