尝试组合hamcrest匹配器时出现编译错误

时间:2017-07-18 12:41:46

标签: java generics testing hamcrest

我有一个字符串队列,我想在一个断言中组合2个匹配器 (简化)代码就是这样的

    Queue<String> strings = new LinkedList<>();
    assertThat(strings, both(hasSize(1)).and(hasItem("Some string")));

但是当我编译它时,我收到以下消息:

incompatible types: no instance(s) of type variable(s) T exist so that org.hamcrest.Matcher<java.lang.Iterable<? super T>> conforms to org.hamcrest.Matcher<? super java.util.Collection<? extends java.lang.Object>>
  • hasItem返回Matcher<Iterable<? super T>>
  • hasSize返回Matcher<Collection<? extends E>>

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

两个匹配者必须符合......

Matcher<? super LHS> matcher

...其中LHS是Collection<?>,因为stringsCollection<?>

在您的代码中hasSize(1)Matcher<Collection<?>>hasItem("Some string")Matcher<Iterable<? super String>>因此编译错误。

此示例使用可组合的匹配器并且可以编译,因为两个匹配器都可以处理集合......

assertThat(strings, either(empty()).or(hasSize(1)));

但鉴于both()的方法签名,您无法合并hasSize()hasItem()

可组合匹配器只是一个捷径,所以也许你可以用两个断言替换它:

assertThat(strings, hasSize(1));
assertThat(strings, hasItem("Some string"));