Hamcrest 匹配器,用于检查集合中方法的返回值

问题描述 投票:0回答:2

hasProperty
可以与
hasItem
一起使用来检查给定属性的值,例如:

Matcher hasName = Matchers.<Person>hasProperty("name", is("Winkleburger"));
assertThat(names, hasItem(hasName));

当 name 是一个属性时,这很好,即:有一个名为

getName()
的方法。

是否有一个匹配器可以检查不是属性的方法? IE: 在这种情况下,它将检查集合中项目的方法

name()
而不是
getName()
的返回值。

java hamcrest
2个回答
28
投票

您可以使用另一个内置的 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"

2
投票

你可以自己写一个:

public class HasName extends TypeSafeMatcher<MyClass> {
    private String expectedName;

    private HasName(String expectedName) {
        this.expectedName = expectedName;
    }

    @Override
    public boolean matchesSafely(MyClass obj) {
        return expectedName.equals(obj.name());
    }

    @Factory
    public static Matcher<MyClass> hasName(String expectedName) {
        return new HasName(expectedName);
    }
}

其中

MyClass
是定义
name()
方法的类或接口。

© www.soinside.com 2019 - 2024. All rights reserved.