gpt4 book ai didi

java - Mockito returnsFirstArg() 不适用于通用的第一个参数

转载 作者:搜寻专家 更新时间:2023-10-31 20:33:35 25 4
gpt4 key购买 nike

EDIT: I've finally created an issue on mockito github project.

我正在尝试模拟接口(interface) RoomGeneralService 的类型化方法 getNameElement 以返回第一个 arg,使用 Mockito AdditionalAnswers.returnsFirstArg 功能:

模拟接口(interface):

interface PrimaryKeyElement<T> {
public String getNameElement(T primaryKey);
}

interface RoomGeneralService extends PrimaryKeyElement<String> {
// ...
}

我的测试(注意导入)

import static org.mockito.AdditionalAnswers.returnsFirstArg;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.when;

@RunWith(PowerMockRunner.class)
public class SampleTest {

@Mock
RoomGeneralService roomGeneralService;

@Test
public void testFoo() throws Exception {
when(roomGeneralService.getNameElement(anyString())).thenAnswer(returnsFirstArg());
//...
}
}

我也尝试过其他组合,但到目前为止没有成功:

when(roomGeneralService.getNameElement(Matchers.<String>any())).thenAnswer(returnsFirstArg());
doAnswer(returnsFirstArg()).when(roomGeneralService.getNameElement(anyString()));
doReturn(returnsFirstArg()).when(roomGeneralService.getNameElement(anyString()));

收到错误:

The reason for this error can be : 1. The wanted argument position is incorrect. 2. The answer is used on the wrong interaction.

Position of the wanted argument is 0 and the possible argument indexes for this method are : [0] Object

解决方法:

我知道我可以创建自己的答案,事实上,如果不使用 returnFirstArg() 我会做这样的事情,它工作正常:

when(roomGeneralService.getNameElement(anyString())).thenAnswer(new Answer<String>() {
@Override
public String answer(InvocationOnMock invocation) throws Throwable {
return (String) invocation.getArguments()[0];
}
});

但我会像在我的其余测试中一样使用 returnFirstArg()(测试看起来更干净),并且如果方法 getNameElement 将接收到模拟,则模拟工作正常String 而不是 T 参数。

感谢您的帮助。

最佳答案

似乎 Mockito 不够聪明,无法推断参数类型将绑定(bind)到参数化子接口(interface)中的 String

可以覆盖子接口(interface)中的方法

interface RoomGeneralService extends PrimaryKeyElement<String> {
@Override
public String getNameElement(String primaryKey);
}

Mockito 无需猜测。它会清楚地将 String 视为 stub 方法的参数类型。

关于java - Mockito returnsFirstArg() 不适用于通用的第一个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30670275/

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