java - Mockito 更改非 void 方法的参数值

标签 java mockito

我正在尝试模拟一个方法,其签名是:

public A doSomething(B b, String str){}

我尝试使用 doAnswer 更新 str 值。但是,此方法返回具有条件设置值的对象 A。我无法找到一种方法来设置要传递给此方法的特定 str 值。谁能告诉我这是如何实现的?我不能在我的项目中使用 powermock。

最佳答案

对于一次性模拟,您可以使用 InvocationOnMock.getArguments获取 str 的值:

doAnswer(new Answer<Foo>() {
  @Override public Foo answer(InvocationOnMock invocation) {
    A a = mock(A.class);
    when(a.someMethod()).thenReturn((String) (invocation.getArguments()[0]));
    return a;
  }
}).when(yourObject).doSomething(any(B.class), anyString());

// or with Java 8:
doAnswer(invocation => {
  A a = mock(A.class);
  when(a.someMethod()).thenReturn((String) (invocation.getArguments()[0]));
  return a;
}).when(yourObject).doSomething(any(), anyString());

...但只要该方法是可模拟的(可见的和非最终的),您也可以将您的新方法内联编写为匿名内部子类(或在其他地方定义的静态子类),这可以完成相同的事情没有那么多转换和 Mockito 语法:

YourObject yourObject = new YourObject() {
  @Override public A someMethod(B b, String str) {
    A a = mock(A.class);
    when(a.someMethod()).thenReturn(str);
    return a;
  }
};

关于java - Mockito 更改非 void 方法的参数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44115014/

相关文章:

Java - Checkstyle - 冗余抛出

用于音频处理的 Java 实用吗?

java - 为 POI 中的合并单元格创建边框

android - Kotlin、Mockito 和 Android 测试仪器。 Lateinit 属性尚未初始化

java - Mockito - 即使使用 returns_self,模拟构建器也会返回空对象

java - 如何创建 get() 调用返回可选包装值的自定义映射?

java - JSON 中 RestTemplate 中的 GET 请求

java - Junit Mockito 测试用例给出的方法 X 给出的类型不明确

android retrofit2, dagger2 单元测试

android - 如何在Kotlin Android UI测试中初始化模拟的外部依赖项