gpt4 book ai didi

java - Mockito:如何模拟通用方法的 doAnswer

转载 作者:行者123 更新时间:2023-12-02 10:12:09 26 4
gpt4 key购买 nike

我有一个类,本质上是这样的:

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

最佳答案

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

final Function<String, String> argument = invocation.getArgument(1);

这是您要找的吗? getArgument 泛型类型的类型推断工作正常。

如果没有,你能提供一个更详细的例子吗?

关于java - Mockito:如何模拟通用方法的 doAnswer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54932850/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com