繁体   English   中英

如何模拟带有可变参数和 thenAnswer lambda 的方法?

[英]How to mock a method with varargs and a thenAnswer lambda?

我正在尝试模拟一个在其签名中具有可变参数的方法。 原始方法:

public class ThisThing {
  public String doIt( Sumpin a, String b, String... c) {
    // return a string
  }
}

这是我尝试的模拟(我读到any()匹配可变参数):

when(mockThing.doIt(
    any(),
    any(),
    any()
  ))
.thenAnswer( (a, b, c) -> b );

但是 Eclipse 将thenAnswer标记为错误:

The method thenAnswer(Answer<?>) in the type OngoingStubbing<String> is not applicable for the arguments ((<no type> a, <no type> b, <no type> c) -> {})

而且 lambda 表达式也是错误的:

Lambda expression's signature does not match the signature of the functional interface method answer(InvocationOnMock)

我还尝试将第二个any()匹配器更改为anyString()无效。 奇怪的是,如果我将 lambda 替换为a -> a ,所有错误都会消失。 lambda中不允许有多个arguments吗?

我做错了什么,我可以做我想做的事吗?

我不确定你的问题是什么。 您可以模拟特定数量的方法参数,模拟将起作用

测试类

@Mock
private SomeService someService;

@Test
void someTestMethodTest() {
  when(someService.testSomething(any(),any(),any(),any())).thenAnswer(new Answer<Object>() {
    @Override
    public Object answer(InvocationOnMock invocationOnMock) throws Throwable {
        return "ooooo";
    }
  });
  String testsomething = someService.testsomething("a", "a", "a", "a");
  System.out.println(testsomething);
}

someService 中的“实际实现”

public String testSomething(String a, String b , String... c){
  return "asad";
}

您确定要使用“thenAnswer”而不是“thenReturn”吗?使用 return 通常更容易。

编辑:

当需要明确使用 lambda 时,替代方法是

when(someService.testsomething(any(),any(),any(),any())).thenAnswer(a -> "oooo");

当显式获取输入参数“2”作为返回

when(someService.testsomething(any(),any(),any(),any())).thenAnswer(a -> a.getArguments()[1]);

会成功的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM