Mockito并不擅长匹配泛型本身,但是您的解决方案比一般情况要容易得多。
更换:
Matchers.<ParameterizedTypeReference<SearchResultsDTO<SolrdocumentDTO>>>any())
与:
eq(new ParameterizedTypeReference<SearchResultsDTO<SolrdocumentDTO>>() {}))首先,
Matchers.any()不匹配类型,甚至不匹配类型
any(Foo.class)(从Mockito
1.x开始)。
any()匹配所有值,包括null和不正确的类型:
匹配任何对象,包括空值
此方法不使用给定参数进行类型检查,仅在此位置使用,以避免强制转换代码。但是,在将来的主要版本中,可能会更改(可以添加类型检查)。
泛型有助于为
exchange和获得正确的参数
thenReturn,但是由于类型擦除,所有类型信息都无法将其放入CLASS文件中,更不用说JVM了。断言其参数类型的唯一Matcher是
isA,它采用类文字,并且对参数化类型没有帮助。
您可以编写一个自定义的Matcher,以检查参数的类型和类型参数(如果它们不需要擦除),但是对于您的特定情况,则没有必要。
类型擦除是存在ParameterizedTypeReference的全部原因:它将泛型信息捕获到一个子类中,在该子类中
不会 删除参数化的类型。此相同的模式被用于TypeToken在番石榴或TypeLiteral在吉斯。所有这些实现都
将参数化类型描述为实例 。
重要的是,它们(包括ParameterizedTypeReference)都支持
equals和
hashCode,即使实例不同,也
newParameterizedTypeReference<A<B>>(){}等于newParameterizedTypeReference<A<B>>(){}。(请参见此处的代码。)因为对相同参数化类型的引用相等,所以将Mockito的
eq匹配器与其他引用一起使用,情况应该会很好。



