Mockito:如何为通用方法模拟doAnswer

时间:2019-02-28 19:23:55

标签: java generics lambda mockito

我有一个实质上是这样的课程:

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

1 个答案:

答案 0 :(得分:1)

这里的问题是您坚持使用getArguments,它返回一个Object[]
由于您知道参数的索引,因此您可以使用Function,因为在此之后的代码行。

getArgument(index)

这是您要找的吗? final Function<String, String> argument = invocation.getArgument(1); 泛型的类型推断工作正常。

如果没有,您能否提供一个更详细的示例?

相关问题