发生此错误是因为编译器无法保证返回的映射的值类型getValue
实际上是List<Bar>
. 该类型的Map<Foo, ? extends Collection>
意思是“某个未知Map
类型的实现”。Foo
Collection
这是一个很好的例子,说明了为什么不鼓励在返回类型中使用通配符,因为它们通常会通过掩盖有关返回内容的泛型类型信息来抑制调用者(相反,鼓励在方法参数中使用通配符,因为它使调用者的事情变得更容易)。如果可能的话,我建议去掉通配符:
Map<Foo, Collection<Bar>> getValue();
并使用:
model = Mockito.mock(Model.class);
Map<Foo, Collection<Bar>> value = new HashMap<Foo, Collection<Bar>>();
Mockito.when(model.getValue()).thenReturn(value);
如果您无法更改方法的返回类型,则可以使用“捕获助手”方法进行测试:
private <T extends Collection<Bar>> test(Map<Foo, T> actual) {
Map<Foo, T> expected = new HashMap<Foo, T>();
Mockito.when(actual).thenReturn(expected);
}
...
model = Mockito.mock(Model.class);
test(model.getValue()); // T is resolved to wildcard capture
当然,这是非常有限的,因为您只能在不知道是什么的情况下测试空地图T
。