Mockito anyListOf() 列表<List<String>>

Mockito anyListOf() List<List<String>>

我正在使用 mockito-core:2.8.47Java 7 并想在某个时候使用并验证 anyListOf 或其他任何方法。 我的问题是,如果我只使用 anyList,它会说:

The method name( int, List < List < String > >) in the type Y is not
applicable for the arguments ( int, List < Object > )

我该如何解决这个问题?

ArgumentMatchers.anyListOf(ArgumentMatchers.anyListOf( String.class ) ) 不起作用...

在我看来,您可以只使用基本的 anyList() 方法并添加额外的泛型信息:

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

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

有两种方法:

  1. 简单地在 any() 上进行转换作为一个足够的类型提示:
Mockito.doReturn("1")
    .when(classMock)
    .name(eq(1), (List<List<String>>) any());
  1. 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());