Java Mockito returns firstarg()不';不能使用泛型第一个参数
编辑:我终于创建了一个关于mockito github的项目 我正在尝试模拟InterfaceJava Mockito returns firstarg()不';不能使用泛型第一个参数,java,mocking,mockito,powermock,matcher,Java,Mocking,Mockito,Powermock,Matcher,编辑:我终于创建了一个关于mockito github的项目 我正在尝试模拟InterfaceRoomGeneralService的类型化方法getNameElement,使用MockitoAdditionalAnswers返回第一个参数。returnsFirstArg功能: 模拟界面: interface PrimaryKeyElement<T> { public String getNameElement(T primaryKey); } interface RoomGe
RoomGeneralService
的类型化方法getNameElement
,使用MockitoAdditionalAnswers返回第一个参数。returnsFirstArg
功能:
模拟界面:
interface PrimaryKeyElement<T> {
public String getNameElement(T primaryKey);
}
interface RoomGeneralService extends PrimaryKeyElement<String> {
// ...
}
我也尝试过其他组合,但迄今为止没有成功:
when(roomGeneralService.getNameElement(Matchers.<String>any())).thenAnswer(returnsFirstArg());
doAnswer(returnsFirstArg()).when(roomGeneralService.getNameElement(anyString()));
doReturn(returnsFirstArg()).when(roomGeneralService.getNameElement(anyString()));
但是我会像在我的其他测试中一样使用returnFirstArg()
(测试看起来更干净),如果方法getnamelement
将接收一个String
而不是T
arg,那么模拟工作正常
感谢您的帮助。Mockito似乎不够聪明,无法推断参数类型将绑定到参数化子接口中的
字符串
可以在子接口中重写该方法
interface RoomGeneralService extends PrimaryKeyElement<String> {
@Override
public String getNameElement(String primaryKey);
}
interface RoomGeneralService扩展了PrimaryKeyElement{
@凌驾
公共字符串getNameElement(字符串主键);
}
莫基托不用猜了。它将清楚地看到String
作为存根方法的参数类型。我最终决定在mockito github项目上打开一个问题(),它已在版本2.8.29中修复(见官方),这要感谢mockito团队如此快速地解决它
引用@ChristianSchwarz的话,这里有一个问题的解释:
Mockito检查参数类型是否与返回类型兼容
使API的误用尽快可见。在这种情况下
参数类型对象是从泛型类型T推断出来的,原因是
类型擦除。因为对象不是字符串Mockito抛出的子类型
你看到的例外
解决方案:可以通过推断
实际参数实例。如果参数类型是基元或
arg为null,Mockito必须回退并使用提供的类型
方法签名
首先,谢谢你的回答。不幸的是,方法重写不是项目的选项。如果Mockito不能做到这一点,我建议您继续解决这个问题。@troig您不控制这些接口的源代码吗?不,这就是问题所在。无论如何,谢谢你的方法。
when(roomGeneralService.getNameElement(anyString())).thenAnswer(new Answer<String>() {
@Override
public String answer(InvocationOnMock invocation) throws Throwable {
return (String) invocation.getArguments()[0];
}
});
interface RoomGeneralService extends PrimaryKeyElement<String> {
@Override
public String getNameElement(String primaryKey);
}