Java:我如何定义一个匿名的Hamcrest Matcher?

时间:2016-05-25 05:04:26

标签: java hamcrest

我尝试使用JUnit / Hamcrest声明一个集合包含至少一个我的自定义逻辑断言的元素是真的。我希望有某种类似的匹配器,如任何'任何'采用lambda(或匿名类定义),我可以在其中定义自定义逻辑。我已经尝试过TypeSafeMatcher,但无法弄清楚如何处理它。

我不认为任何我正在寻找的东西,因为这似乎是一个Matchers列表。

2 个答案:

答案 0 :(得分:2)

你正在测试什么?您很有可能会使用hasItemallOfhasProperty之类的匹配器组合,否则您可以实施org.hamcrest.TypeSafeMatcher。我发现查看现有匹配器的源代码有帮助。我在下面创建了一个基本的自定义匹配器,匹配属性

public static class Foo {
    private int id;
    public Foo(int id) {
        this.id = id;
    }
    public int getId() {
        return id;
    }
}

@Test
public void customMatcher() {
    Collection<Foo> foos = Arrays.asList(new Foo[]{new Foo(1), new Foo(2)});
    assertThat(foos, hasItem(hasId(1)));
    assertThat(foos, hasItem(hasId(2)));
    assertThat(foos, not(hasItem(hasId(3))));
}

public static Matcher<Foo> hasId(final int expectedId) {
    return new TypeSafeMatcher<Foo>() {

        @Override
        protected void describeMismatchSafely(Foo foo, Description description) {
            description.appendText("was ").appendValue(foo.getId());
        }

        @Override
        public void describeTo(Description description) {
            description.appendText("Foo with id ").appendValue(expectedId);
        }

        @Override
        protected boolean matchesSafely(Foo foo) {
            // Your custom matching logic goes here
            return foo.getId() == expectedId;
        }
    };
}

答案 1 :(得分:0)

也许Matchers.hasItems()可以帮到你?

List<String> strings = Arrays.asList("a", "bb", "ccc");

assertThat(strings, Matchers.hasItems("a"));
assertThat(strings, Matchers.hasItems("a", "bb"));

Matchers还有一种方法可以提供其他Matcher作为参数,即hasItems(Matcher<? super >... itemMatchers)

此外,有一些方法可用于数组hasItemInArray(T element)hasItemInArray(Matcher<? super > elementMatcher)