协慌网

登录 贡献 社区

使模拟方法返回传递给它的参数

考虑如下方法签名:

public String myFunction(String abc);

Mockito 可以帮助返回该方法收到的相同字符串吗?

答案

您可以在 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 开始,您还可以使用 lambda 表达式:

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

如果您具有 Mockito 1.9.5 或更高版本,则有一个新的静态方法可以为您Answer你需要写一些类似的东西

import static org.mockito.Mockito.when;
import static org.mockito.AdditionalAnswers.returnsFirstArg;

when(myMock.myFunction(anyString())).then(returnsFirstArg());

或者

doAnswer(returnsFirstArg()).when(myMock).myFunction(anyString());

注意, returnsFirstArg() AdditionalAnswers类中是静态的,它是 Mockito 1.9.5 的新增功能。因此您需要正确的静态导入。

使用 Java 8,即使使用旧版本的 Mockito,也可以创建单行答案:

when(myMock.myFunction(anyString()).then(i -> i.getArgumentAt(0, String.class));

当然,这不如使用AdditionalAnswers有用,但是如果您想 “即时” 转换参数,则可能有用。