使用junit测试Maps时使用通用的有界通配符

时间:2015-09-25 20:17:29

标签: java generics junit hamcrest

我试图理解为什么这个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>的子类型,为什么这不起作用?

1 个答案:

答案 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>>>不兼容。