Java Mockito returns firstarg()不';不能使用泛型第一个参数

Java 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

编辑:我终于创建了一个关于mockito github的项目

我正在尝试模拟Interface
RoomGeneralService
的类型化方法
getNameElement
,使用Mockito
AdditionalAnswers返回第一个参数。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);
}