模拟 void 方法,改变它们的参数
Mock void methods, which change their argument
我有一个界面,看起来像这样
public interface ParameterProvider
{
void provideParameter(Map<String, String> parameters);
}
它的一个实例用在我要为其编写单元测试的方法中:
@Override
public void process(...)
{
...
Map<String, String> parameters = new HashMap<String, String>();
parameterProvider.provideParameter(parameters);
...
}
如何模拟 ParameterProvider
以对传递给其 provideParameter
方法的参数执行操作?
我的第一个想法是将 return 类型从 void
更改为 Map
实际上 return 修改后的 Map
(这看起来好多了反正)。然后测试没问题:
when(parameterProvider.provideParameter(anyMap())).thenReturn(MY_PARAMETERS);
然而,由于接口是在框架中使用的,出于某种奇怪的原因,框架似乎要求方法无效,所以现在这不是一个选项。
有没有办法仍然嘲笑这个东西。我正在使用 Mockito,但如果有其他模拟框架可以完成工作,我不需要坚持使用它。
编辑:
我也尝试使用 doAnwser
,但我没有看到如何修改传递给方法的参数:
doAnswer(new Answer() {
public Object answer(InvocationOnMock invocation) {
Object[] args = invocation.getArguments();
args[0] // that's the argument I want to modify
return null;
}})
.when(parameterProvider).provideParameter(anyMap());
Mockito.doAnswer() will allow you to mock void methods and manipulate the parameters passed to it via your own closure/class implementing Answer(前提是你的参数是 可变的)。
根据您的代码:
doAnswer(new Answer() {
public Object answer(InvocationOnMock invocation) {
Object[] args = invocation.getArguments();
args[0] // that's the argument I want to modify
return null;
}})
.when(parameterProvider).provideParameter(anyMap());
args[0] 将是一个 Map(通过调试器检查)并假设它是可变的,您应该能够 populate/change 在您的匿名 class 中 class 例如
((Map)args[0]).put(x, y);
我有一个界面,看起来像这样
public interface ParameterProvider
{
void provideParameter(Map<String, String> parameters);
}
它的一个实例用在我要为其编写单元测试的方法中:
@Override
public void process(...)
{
...
Map<String, String> parameters = new HashMap<String, String>();
parameterProvider.provideParameter(parameters);
...
}
如何模拟 ParameterProvider
以对传递给其 provideParameter
方法的参数执行操作?
我的第一个想法是将 return 类型从 void
更改为 Map
实际上 return 修改后的 Map
(这看起来好多了反正)。然后测试没问题:
when(parameterProvider.provideParameter(anyMap())).thenReturn(MY_PARAMETERS);
然而,由于接口是在框架中使用的,出于某种奇怪的原因,框架似乎要求方法无效,所以现在这不是一个选项。
有没有办法仍然嘲笑这个东西。我正在使用 Mockito,但如果有其他模拟框架可以完成工作,我不需要坚持使用它。
编辑:
我也尝试使用 doAnwser
,但我没有看到如何修改传递给方法的参数:
doAnswer(new Answer() {
public Object answer(InvocationOnMock invocation) {
Object[] args = invocation.getArguments();
args[0] // that's the argument I want to modify
return null;
}})
.when(parameterProvider).provideParameter(anyMap());
Mockito.doAnswer() will allow you to mock void methods and manipulate the parameters passed to it via your own closure/class implementing Answer(前提是你的参数是 可变的)。
根据您的代码:
doAnswer(new Answer() {
public Object answer(InvocationOnMock invocation) {
Object[] args = invocation.getArguments();
args[0] // that's the argument I want to modify
return null;
}})
.when(parameterProvider).provideParameter(anyMap());
args[0] 将是一个 Map(通过调试器检查)并假设它是可变的,您应该能够 populate/change 在您的匿名 class 中 class 例如
((Map)args[0]).put(x, y);