制作模拟方法返回传递给它的参数 | Java Debug 笔记

177 阅读1分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看活动链接


问题描述

考虑一种方法签名,如:

public String myFunction(String abc);

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

部分高赞回答

最高赞回答(1111赞)

您可以在Mockito话题下创建一个答案。假设我们有一个名为应用程序的接口,具有方法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]);

第二高赞回答(618赞)

如果你有Mockito 1.9.5或更高版本的话,这里有一个新的静态方法可以为您制作答案对象。你要写类似的

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的新特性;所以你需要正确的静态导入。

本文翻译自Stack Overflow。关于翻译文章,聆风也相对生疏,难免有错漏,欢迎各位大佬在评论区批评指正,谢谢!