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/

10-13 01:16