Mockito anyListOf() List<List<String>>

4
我正在使用mockito-core:2.8.47Java 7,想在when和verify中使用anyListOf或其他任何方法。
我的问题是,如果我只使用anyList,它会显示以下消息:

类型Y中的方法name(int,List < List < String >>)不适用于参数(int,List < Object >)

如何解决这个问题呢? ArgumentMatchers.anyListOf( ArgumentMatchers.anyListOf( String.class ) )不起作用...
2个回答

8

我的观点是,您只需使用基本的anyList()方法并添加额外的泛型信息即可:

Mockito.doReturn("1").when(classMock).name(ArgumentMatchers.eq(1)
                , ArgumentMatchers.<List<String>>anyList());

这个方法对我有用,同时也要记得为第一个int变量添加ArgumentMatcher,否则Mockito会失败。


0

这个问题有两种解决方案:

  1. 简单地将 any() 转换为目标类型作为足够的类型提示:
Mockito.doReturn("1")
    .when(classMock)
    .name(eq(1), (List<List<String>>) any());

提供额外的泛型信息给anyList()。这基本上是与下面的答案相同的方法,只是使用了别名Mockito,它映射到ArgumentMatcher实现,因此更加简洁。
Mockito.doReturn("1")
    .when(classMock)
    .name(eq(1), Mockito.<List<String>> anyList());

这两者之间有微妙但值得注意的区别。想象一下 name() 有以下两个重载:

// Overload A (target of this test)
String name(int id, Object entities) {...}

// Overload B (not targeted in this test)
String name(int id, List<CustomMapImpl> entities) {...}

当测试代码中的第二个参数变为null时,方法1也会正确匹配重载A,而方法2则会解析为重载B。为了使用泛型匹配特定情况,需要明确地使用不同的ArgumentMatcher进行定义:

Mockito.doReturn(null)
    .when(classMock)
    .name(eq(1), Mockito.<List<List<String>>>isNull());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接