gpt4 book ai didi

java - 模拟 void 方法,改变它们的参数

转载 作者:搜寻专家 更新时间:2023-10-31 19:27:39 26 4
gpt4 key购买 nike

我有一个界面,看起来像这样

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

然而,由于接口(interface)是在框架中使用的,出于某种奇怪的原因,框架似乎要求方法为空,所以现在这不是一个选项。

有没有办法仍然 mock 这个东西。我正在使用 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()将允许您模拟 void 方法并通过您自己的闭包/类实现 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(通过调试器检查)并假设它是可变的,您应该能够在您的匿名类中填充/更改它,例如

((Map)args[0]).put(x, y);

关于java - 模拟 void 方法,改变它们的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28341442/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com