2

我正在使用mockito-core:2.8.47并且Java 7想要在 when 和 verifyanyListOf或其他任何方法中使用。我的问题是,如果我只是使用anyList它说:

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

我怎样才能解决这个问题?

ArgumentMatchers.anyListOf(ArgumentMatchers.anyListOf( String.class ) )不工作...

4

2 回答 2

5

在我看来,您可以只使用anyList()带有其他泛型信息的基本方法:

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

这对我有用,还记得ArgumentMatcher为第一个 int 变量添加,否则 Mockito 将失败。

于 2017-09-19T08:21:25.347 回答
0

有两种方法:

  1. 简单地强制转换any()作为一个足够的类型提示:
Mockito.doReturn("1")
    .when(classMock)
    .name(eq(1), (List<List<String>>) any());
  1. anyList(). 这与下面的答案
    基本相同,只是在使用别名时更简洁一点,它映射到实现。MockitoArgumentMatcher
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());
于 2022-02-23T13:45:43.807 回答