如何模拟带有可变参数和 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() 但没有效果。奇怪的是,如果我用 a -> a 替换 lambda,所有错误都会消失。 lambda 中是否不允许使用多个参数?

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

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

测试类

@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);
}

某些服务中的“实际实现”

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”作为 return 时

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

会成功的。