我有类Generic< T,R>的两个泛型对象:
Generic<TypeA, TypeB> genericOne;
Generic<TypeB, TypeC> genericTwo;
我必须嘲笑:
when(someObject.someMethod(Matchers.<Generic<TypeA, TypeB>>any()))
.thenReturn(responseOne());
when(someObject.someMethod(Matchers.<Generic<TypeB, TypeC>>any()))
.thenReturn(responseTwo());
问题在于,由于类型擦除,mockito不会看到这两个方法调用之间的区别-它们都被识别为Generic< T,R>.类.
有什么方法可以区分这两个方法调用吗?
解决方法:
Mockito不知道在any()调用之前指定了哪些泛型,无论如何都没有关系.
录制模拟行为时预期的参数必须依赖:
>值(根据equals()
>或按captor(如果equals()不足够)
>或any(),如果模拟调用中的参数值无关紧要或在测试夹具中未知
这些永远不必依赖指定的泛型.
举一个很好的例子,看看Mockito.anyCollectionOf(Class T clazz)或Mockito.anyMapOf(Class K keyClazz,Class V valueClazz).
这些方法知道已通过的类,但是无论如何,它们的规范状态为:
This method don’t do any type checks, it is only there to avoid
casting in your code. This might however change (type checks could be
added) in a future major release.
通常,您要检查的是要模拟的方法是使用期望的参数而不是任何参数调用的:因此any()将永远无法实现它.
因此,尝试仅检查泛型类型但接受任何值作为参数似乎是一种反模式模拟.
在您的情况下,如果equals()不便于在when()记录中进行匹配,请在Mockito捕获器中使用verify()并在执行模拟后进行检查.