我有一个界面,看起来像这样
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
- 方法?
我的第一个想法是将返回类型从void
更改为Map
并实际返回修改后的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());
答案 0 :(得分:10)
Mockito.doAnswer()将允许您模拟void方法并通过您自己的闭包/类实现Answer来操纵传递给它的参数(假设您的参数 mutable ,显然)
所以给你的代码:
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(通过调试器检查)并假设它是可变的,你应该能够在你的匿名类中填充/更改它,例如。
((Map)args[0]).put(x, y);