Java mockito中的其他答案未返回正确类型

Java mockito中的其他答案未返回正确类型,java,mocking,mockito,stub,Java,Mocking,Mockito,Stub,我试图使用Mockito来存根一个方法,但是为了让它工作,我需要使用传递给这个函数的参数 这是我现在的代码,但它没有编译: when(layer.createNewPlaylist("playlist1", Mockito.any(UUID.class))).thenReturn(new OnDemandPlaylist("playlist1", "", AdditionalAnswers.returnsArgAt(1))); 总之,我希望将第二个参数传递给返回的新对象 现在,我有一个错误:

我试图使用Mockito来存根一个方法,但是为了让它工作,我需要使用传递给这个函数的参数

这是我现在的代码,但它没有编译:

when(layer.createNewPlaylist("playlist1", Mockito.any(UUID.class))).thenReturn(new OnDemandPlaylist("playlist1", "", AdditionalAnswers.returnsArgAt(1)));
总之,我希望将第二个参数传递给返回的新对象

现在,我有一个错误:

The constructor OnDemandPlaylist(String, String, Answer<Object>) is undefined
未定义构造函数OnDemandPlaylist(字符串、字符串、答案)
编辑

我找到了一个使用“旧”方式查询参数的解决方案,并在这里分享。但我想知道是否有更简单的方法使用thenReturn语法和附加答案

when(layer.createNewPlaylist(Mockito.eq("playlist1"), Mockito.any(UUID.class)))
            .thenAnswer(new Answer<OnDemandPlaylist>() {
                 public OnDemandPlaylist answer(InvocationOnMock invocation) {
                     Object[] args = invocation.getArguments();
                     return new OnDemandPlaylist("playlist1", "", (UUID)args[1]);
                     }
                 });
when(layer.createNewPlaylist(Mockito.eq(“playl1”),Mockito.any(UUID.class)))
.thenAnswer(新答案){
公共OnDemand播放列表应答(调用锁调用){
对象[]args=invocation.getArguments();
返回新的OnDemandPlaylist(“播放列表1”、“UUID”参数[1]);
}
});

此代码误用了Mockito API:

when(layer.createNewPlaylist("playlist1", Mockito.any(UUID.class)))
    .thenReturn(new OnDemandPlaylist("playlist1", "", AdditionalAnswers.returnsArgAt(1)));
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                this is wrong
AdditionalAnswers.returnsArgAt(1)
返回一个
答案
,该答案将在位置1返回arg(其类型在编译时未知),因此这有点像是在构造函数上出现编译错误,因为第三个参数是
UUID
,而不是Mockito
答案

AdditionalAnswers.returnsArgAt(1)
用法记录在javadoc中:

This additional answer could be used at stub time using the then|do|willAnswer methods. For example :

given(person.remember(dream1, dream2, dream3, dream4)).will(returnsArgAt(3));
doAnswer(returnsArgAt(3)).when(person).remember(dream1, dream2, dream3, dream4);

你的解决方案实际上是做你想做的事情的正确方法。甚至有所有的参数匹配器来存根调用。请注意,使存根更具可读性对于将来的重构有很大的好处:

when(layer.createNewPlaylist(eq("playlist1"), any(UUID.class))).then(playlistWithSameUUID);

public Answer<OnDemandPlaylist> playlistWithSameUUID() {
    return new Answer<OnDemandPlaylist>() {
                 public OnDemandPlaylist answer(InvocationOnMock invocation) {
                     Object[] args = invocation.getArguments();
                     return new OnDemandPlaylist("playlist1", "", (UUID)args[1]);
                     }
                 };
}
when(layer.createNewPlaylist(eq(“playli1”),any(UUID.class))。然后(playliwithsameuid);
使用sameuuid()的公共应答播放列表{
返回新答案(){
公共OnDemand播放列表应答(调用锁调用){
对象[]args=invocation.getArguments();
返回新的OnDemandPlaylist(“播放列表1”、“UUID”参数[1]);
}
};
}