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

Java 用于检查集合中方法返回值的Hamcrest匹配器,java,hamcrest,Java,Hamcrest,hasProperty可与hasItem一起使用,以检查给定属性的值,例如: Matcher hasName = Matchers<Person>hasProperty("name", is("Winkleburger")); assertThat(names, hasItem(hasName)); Matcher hasName=matchersasproperty(“name”,is(“Winkleburger”); 资产(名称,hasItem(hasName)); 当nam

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

Matcher hasName = Matchers<Person>hasProperty("name", is("Winkleburger"));
assertThat(names, hasItem(hasName));
Matcher hasName=matchersasproperty(“name”,is(“Winkleburger”);
资产(名称,hasItem(hasName));
当name是一个属性时,这很好,即:有一个名为
getName()
的方法

是否有一个匹配器将检查不是属性的方法?即:
在这种情况下,它将检查集合中项目的方法
name()
的返回值,而不是
getName()

您可以自己编写一个:

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);
    }
}
public类HasName扩展了TypeSafeMatcher{
私有字符串expectedName;
私有HasName(字符串expectedName){
this.expectedName=expectedName;
}
@凌驾
公共布尔匹配安全(MyClass obj){
返回expectedName.equals(obj.name());
}
@工厂
公共静态匹配器hasName(字符串expectedName){
返回新的HasName(expectedName);
}
}

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

您可以使用另一个内置的Hamcrest来实现此功能,即。在将您的输入转换为其他内容后,这些匹配器被设计为与其他匹配器组合。因此,在您的情况下,您可以这样做:

@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();
        }
    };
}
那么,您想对集合的所有项调用name()方法吗?
java.lang.AssertionError: 
    Expected: a collection containing name "Batman"
    but: name was "Bob", name was "Winkleburger"