【问题标题】:AdditionalAnswers in mockito not returning the good type模拟中的附加答案没有返回好的类型
【发布时间】:2015-01-13 16:13:48
【问题描述】:

我正在尝试使用 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

编辑

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

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

【问题讨论】:

    标签: java mocking mockito stub


    【解决方案1】:

    此代码滥用了 Mockito API:

    when(layer.createNewPlaylist("playlist1", Mockito.any(UUID.class)))
        .thenReturn(new OnDemandPlaylist("playlist1", "", AdditionalAnswers.returnsArgAt(1)));
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                    this is wrong
    

    AdditionalAnswers.returnsArgAt(1) 返回一个 Answer,它将在位置 1 处返回 arg(其类型在编译时未知),所以这有点预期构造函数上存在编译错误,因为第三个参数是 UUID ,而不是 Mockito Answer

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

    【讨论】:

      猜你喜欢
      • 2016-03-29
      • 2019-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-15
      • 2015-09-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多