Java 如何使用hamcrest和mockito断言超类列表等于子类匹配器

Java 如何使用hamcrest和mockito断言超类列表等于子类匹配器,java,mockito,hamcrest,Java,Mockito,Hamcrest,我正在努力做到以下几点 final Matcher<SuperClass> matcher1 = Matchers.hasProperty("a", equalTo("b")); final Matcher<SuperClass> matcher2 = Matchers.hasProperty("c", equalTo("d")); final Matcher<SuperClass> matchers = Matchers.allOf(matcher1, ma

我正在努力做到以下几点

final Matcher<SuperClass> matcher1 = Matchers.hasProperty("a", equalTo("b"));
final Matcher<SuperClass> matcher2 = Matchers.hasProperty("c", equalTo("d"));
final Matcher<SuperClass> matchers = Matchers.allOf(matcher1, matcher2);

List<SubClass> list = someStuff();

assertThat(list, everyItem(matchers));
final Matcher matcher1=Matchers.hasProperty(“a”,equalTo(“b”);
final Matcher matcher2=Matchers.hasProperty(“c”,equalTo(“d”);
final Matcher matchers=matchers.allOf(matcher1,matcher2);
List=someStuff();
资产(列表,每个项目(匹配者));
我在断言行中遇到编译错误,有没有简单的方法来消除这个错误。

泛型

代码的问题在于,您试图断言类型为
list
的列表与类型为
matcher
的匹配器中的每一项匹配

尽管
超类
扩展了
子类
,但
断言
方法要求两者相同

因此,如果您可以强制您的
someStuff()
方法返回一个
超类的列表,您应该可以自由返回。比如像这样的东西

    List<SuperClass> list = someStuff();
    assertThat(list, everyItem(matchers));
List List=someStuff();
资产(列表,每个项目(匹配者));
将消除编译错误。

选项1:
@SuppressWarnings({“unchecked”,“rawtypes”})
@Test public void yourTest(){
final Matcher matcher1=Matchers.hasProperty(“a”,equalTo(“b”);
final Matcher matcher2=Matchers.hasProperty(“c”,equalTo(“d”);
final Matcher matchers=matchers.allOf(matcher1,matcher2);
List=someStuff();
//请注意,此处强制转换为原始类型,对应于抑制的警告。
资产(列表,(匹配者)每个项目(匹配者));
}
备选案文2:
//这些都是Matcher类型。
final Matcher matcher1=Matchers.hasProperty(“a”,equalTo(“b”);
final Matcher matcher2=Matchers.hasProperty(“c”,equalTo(“d”);
final Matcher matchers=matchers.allOf(matcher1,matcher2);
List=someStuff();
资产(列表,每个项目(匹配者));

为什么?Java的泛型处理对于Hamcrest来说太聪明了
everyItem(matchers)
将返回一个
Matcher
,但您没有
Iterable
,您有一个
Iterable
。如果你真的让Matcher方法生成一个
Matcher,那一切都会好起来。编译错误是什么?方法assertThat(T,Matcher
@SuppressWarnings({"unchecked", "rawtypes"})
@Test public void yourTest() {
    final Matcher<SuperClass> matcher1 = Matchers.hasProperty("a", equalTo("b"));
    final Matcher<SuperClass> matcher2 = Matchers.hasProperty("c", equalTo("d"));
    final Matcher<SuperClass> matchers = Matchers.allOf(matcher1, matcher2);
    List<SubClass> list = someStuff();
    // Note cast to raw type here, corresponding to the suppressed warnings.
    assertThat(list, (Matcher) everyItem(matchers));
}
// These are all of type Matcher<SubClass> instead.
final Matcher<SubClass> matcher1 = Matchers.hasProperty("a", equalTo("b"));
final Matcher<SubClass> matcher2 = Matchers.hasProperty("c", equalTo("d"));
final Matcher<SubClass> matchers = Matchers.allOf(matcher1, matcher2);
List<SubClass> list = someStuff();
assertThat(list, everyItem(matchers));