如何模拟带有可变参数和 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]);
会成功的。
我正在尝试模拟一个在其签名中具有可变参数的方法。原方法:
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]);
会成功的。