我有一个实质上是这样的课程:
class Checkpointer {
public <Input,Output> Output runFunction(Input input, Function<Input,Output> function) {
Output output;
// Sometimes run the function, sometimes return an Output from a cache
return output
}
}
我想使用Mockito doAnswer
来模拟此类:
Checkpointer checkpointer; // mocked via @Mock annotation
Mockito
.doAnswer(/* ??? */)
.when(checkpointer)
.runFunction(Mockito.any(), Mockito.any());
我要模拟的功能需要通用。能做到吗?
例如,我的第一次尝试产生了以下结果。我不仅使用Object
作为Function
的类型参数,而且编译器仍然对未检查的强制转换不满意:
Mockito.doAnswer((invocation) ->
{
// compiler is not happy with this cast V
Function<Object,Object> function = (Function<Object,Object>)invocation.getArguments()[1];
return function.apply(invocation.getArgument(0));
}).when(checkpointer).runFunction(Mockito.any(), Mockito.any());
如果无法做到这一点,我认为可以尝试编写自己的模拟类并扩展第一个模拟类并使用Mockito.spy
。
答案 0 :(得分:1)
这里的问题是您坚持使用getArguments
,它返回一个Object[]
由于您知道参数的索引,因此您可以使用Function
,因为在此之后的代码行。
getArgument(index)
这是您要找的吗? final Function<String, String> argument = invocation.getArgument(1);
泛型的类型推断工作正常。
如果没有,您能否提供一个更详细的示例?