【问题标题】:Hamcrest matcher for checking return value of method in collection用于检查集合中方法的返回值的 Hamcrest 匹配器
【发布时间】:2014-09-03 13:56:53
【问题描述】:

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

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

当 name 是一个属性时这很好,即:有一个名为 getName() 的方法。

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

【问题讨论】:

  • 那么,您想对集合的所有项目调用 name() 方法吗?

标签: java hamcrest


【解决方案1】:

您可以为此使用另一个内置的 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() 方法的类或接口。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多