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

问题描述 投票:0回答:2

我有一个字符串队列,我想在一个断言中组合 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>>

我该如何解决这个问题?

java generics testing hamcrest
2个回答
2
投票

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

Matcher<? super LHS> matcher

...其中 LHS 是

Collection<?>
,因为
strings
Collection<?>

在您的代码中,

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"));

0
投票

使用 Hamcrest contains 代替。当集合恰好有 1 个项目与该值匹配时,它将匹配,但如果项目太多或太少,则会报告错误:

assertThat(strings, contains("Some string"))
© www.soinside.com 2019 - 2024. All rights reserved.