我试图理解为什么这个junit断言给我一个编译时错误:
Map<String, Set<String>> actual = methodToTest();
assertThat(result, hasEntry("foo", new HashSet<String>(Arrays.asList("bar"))));
如果我这样写它就可以了:
Map<String, Set<String>> actual = methodToTest();
Set<String> expected = new HashSet<String>(Arrays.asList("bar"));
assertThat(result, hasEntry("foo", expected));
第一个示例中的编译器错误是:
The method assertThat(T, Matcher<? super T>) in the type Assert is not
applicable for the arguments (Map<String,Set<String>>, Matcher<Map<?
extends String,? extends HashSet<String>>>)
HashSet<String>
是Set<String>
的子类型,为什么这不起作用?
答案 0 :(得分:4)
HashSet<String>
是Set<String>
true的子类型。
但是,Matcher<Map<String,HashSet<String>>>
不是Matcher<Map<String,Set<String>>>
的子集。请注意,List<String>
不是List<Object>
的子类型。
assertThat
方法需要Matcher<? super Map<String, Set<String>>>
类型的参数,该参数与Matcher<Map<String,HashSet<String>>>
不兼容。