Как вернуть аргумент, переданный методу Mockito-mocked в функции thenReturn? - PullRequest
0 голосов
/ 13 июня 2019

Это то, чего я хочу достичь.

MyClass doSomething =  mock(MyClass.class);
when(doSomething.perform(firstParameter, any(Integer.class), any(File.class)))
    .thenReturn(firstParameter);

По сути, я хочу, чтобы метод проверяемого класса всегда возвращал первый аргумент, который был передан в метод.

Я пытался использовать ArgumentCaptor, вот так

ArgumentCaptor<File> inFileCaptor = ArgumentCaptor.forClass(File.class);
MyClass doSomething = mock(MyClass.class);
when(doSomething.perform(inFileCaptor.capture(), any(Integer.class), any(File.class)))
    .thenReturn(firstParameter);

Но mockito просто не удалось с этим сообщением об ошибке:

No argument value was captured!
You might have forgotten to use argument.capture() in verify()...
...or you used capture() in stubbing but stubbed method was not called.
Be aware that it is recommended to use capture() only with verify()

Examples of correct argument capturing:
    ArgumentCaptor<Person> argument = ArgumentCaptor.forClass(Person.class);
    verify(mock).doSomething(argument.capture());
    assertEquals("John", argument.getValue().getName());

Я думаю, класс ArgumentCaptor работает только с verify вызовами.

Так как я могу вернуть первый параметр как переданный во время теста?

Ответы [ 2 ]

2 голосов
/ 13 июня 2019

Вы также можете сделать с org.mockito.AdditionalAnswers

when(doSomething.perform(eq(firstParameter), any(Integer.class), any(File.class)))
    .thenAnswer(AdditionalAnswers.returnsFirstArg())

Также решение @Fred может быть написано с помощью лямбды

when(doSomething.perform(eq(firstParameter), any(Integer.class), any(File.class)))
        .thenAnswer(i->i.getArgument(0));
2 голосов
/ 13 июня 2019

Вы обычно делаете это с thenAnswer:

when(doSomething.perform(firstParameter, any(Integer.class), 
             any(File.class)))
    .thenAnswer(new Answer<File>() {
          public File answer(InvocationOnMock invocation) throws Throwable {
        return invocation.getArgument(0);
    }
 };
...