[英]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.