尝试组合 hamcrest 匹配器时出现编译错误
Compilation error when trying to combine hamcrest matchers
我有一个字符串队列,我想在一个断言中组合 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 returns
Matcher<Iterable<? super T>>
- hasSize returns
Matcher<Collection<? extends E>>
我该如何解决?
两个匹配器都必须符合...
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"));
我有一个字符串队列,我想在一个断言中组合 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 returns
Matcher<Iterable<? super T>>
- hasSize returns
Matcher<Collection<? extends E>>
我该如何解决?
两个匹配器都必须符合...
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"));