如何使用匹配器与Hamcrest进行收集?

时间:2016-05-23 05:16:07

标签: java generics junit matcher hamcrest

输入:

  1. 使用MyElement 收集,不含等于方法。
  2. org.hamcrest.TypeSafeMatcher实现,它与某个字段匹配元素。
  3. 目标是使以下声明可编辑:

    Collection<MyElement> elements = ...
    Collection<TypeSafeMatchert> matchers = ...
    assertThat(elements, Matchers.contains(matchers); //<error here
    

    这里有什么用?它要我Matcher<? super java.util.List<MyElement>>并告诉我,我通过了Matcher<java.lang.Iterable<? super java.util.List<MyElement>>>。那么如何在这里传递Matcher Collection?

    有关于使用hamcrest比较集合的question,但没有传递Matchers集合的示例,而不是元素。

2 个答案:

答案 0 :(得分:0)

对匹配器使用List而不是collection,或将其转换为array。

Hamcrest遵循contains方法:

public static <E> org.hamcrest.Matcher<java.lang.Iterable<? extends E>> contains(org.hamcrest.Matcher<? super E>... itemMatchers)

public static <E> org.hamcrest.Matcher<java.lang.Iterable<? extends E>> contains(E... items)

public static <E> org.hamcrest.Matcher<java.lang.Iterable<? extends E>> contains(org.hamcrest.Matcher<? super E> itemMatcher)

public static <E> org.hamcrest.Matcher<java.lang.Iterable<? extends E>> contains(java.util.List<org.hamcrest.Matcher<? super E>> itemMatchers)

正如您所看到的,只有在List或varags的情况下它才会处理Matchers(但如果只传递一个元素,则需要将其转换为数组)。

答案 1 :(得分:0)

您需要定义:

,而不是定义Collection的{​​{1}}
TypeSafeMatchers

这样, List<Matcher<? super MyElement>> matchers = ...; 就会知道你想要什么。