簡體   English   中英

Mockito:如何為通用方法模擬doAnswer

[英]Mockito: how to mock doAnswer for a generic method

本質上,我有一堂課,看起來像這樣:

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泛型類型的類型推斷工作正常。

如果沒有,您能否提供一個更詳細的示例?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM