Заставить смоделированный метод вернуть аргумент, который был ему передан

java.io.File не представляет файл open , он представляет собой путь в файловой системе. Поэтому использование метода close на нем не имеет смысла.

На самом деле этот класс был неправильно назван авторами библиотеки, его следует называть как Path.

590
задан Captain Man 10 May 2019 в 15:16
поделиться

3 ответа

Вы можете создать ответ в Mockito. Предположим, у нас есть интерфейс с именем Application с методом myFunction.

public interface Application {
  public String myFunction(String abc);
}

Вот метод тестирования с ответом Mockito:

public void testMyFunction() throws Exception {
  Application mock = mock(Application.class);
  when(mock.myFunction(anyString())).thenAnswer(new Answer<String>() {
    @Override
    public String answer(InvocationOnMock invocation) throws Throwable {
      Object[] args = invocation.getArguments();
      return (String) args[0];
    }
  });

  assertEquals("someString",mock.myFunction("someString"));
  assertEquals("anotherString",mock.myFunction("anotherString"));
}

Начиная с Mockito 1.9.5 и Java 8 существует еще более простой способ использования лямбда-функций:

when (myMock.myFunction (anyString ())). thenAnswer (i -> i.getArguments () [0]);

927
ответ дан 3 November 2019 в 21:34
поделиться

Можно достигнуть этого при помощи , ArgumentCaptor

Предполагает, что у Вас есть бобовая функция как так.

public interface Application {
  public String myFunction(String abc);
}

Тогда в Вашем тестовом классе:

//Use ArgumentCaptor to capture the value
ArgumentCaptor<String> param = ArgumentCaptor.forClass(String.class);


when(mock.myFunction(param.capture())).thenAnswer(new Answer<String>() {
    @Override
    public String answer(InvocationOnMock invocation) throws Throwable {
      return param.getValue();//return the captured value.
    }
  });

ИЛИ , если Вы вентилируете лямбды просто, сделайте:

//Use ArgumentCaptor to capture the value
ArgumentCaptor<String> param = ArgumentCaptor.forClass(String.class);


when(mock.myFunction(param.capture()))
    .thenAnswer((invocation) -> param.getValue());

Сводка: Использование argumentcaptor, для получения параметра передало. Позже в возврате ответа значение получило использование getValue.

0
ответ дан 3 November 2019 в 21:34
поделиться

Это немного старо, но я приехал сюда, потому что у меня была та же проблема. Я использую JUnit, но на этот раз в приложении Kotlin с mockk. Я отправляю образец здесь для ссылки и сравнения с дубликатом Java:

@Test
fun demo() {
  // mock a sample function
  val aMock: (String) -> (String) = mockk()

  // make it return the same as the argument on every invocation
  every {
    aMock.invoke(any())
  } answers {
    firstArg()
  }

  // test it
  assertEquals("senko", aMock.invoke("senko"))
  assertEquals("senko1", aMock.invoke("senko1"))
  assertNotEquals("not a senko", aMock.invoke("senko"))
}
0
ответ дан 3 November 2019 в 21:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: