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