Mockito: как смоделировать doAnswer для универсального метода - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть класс, который, по сути, выглядит следующим образом:

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());

Функция Iхочу издеваться надо быть родовым.Можно ли это сделать?

Например, моя первая попытка привела к следующему.Мало того, что я прибегнул к 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 голосов
/ 28 февраля 2019

Проблема здесь в том, что вы настаиваете на использовании getArguments, который возвращает Object[]
Поскольку вы знаете индекс аргумента Function, вы можете использовать getArgument(index),после того, как вы делаете линию после этого.

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

Это то, что вы ищете?Вывод типа для универсального типа getArgument работает нормально.

Если нет, можете ли вы привести более сложный пример?

...