【问题标题】:Mockito: List Matchers with genericsMockito:使用泛型列出匹配器
【发布时间】:2012-05-09 08:22:58
【问题描述】:

Mockito 提供:

when(mock.process(Matchers.any(List.class)));

如果process 取而代之的是List<Bar>,如何避免警告?

【问题讨论】:

    标签: java generics warnings mockito matcher


    【解决方案1】:

    对于 Java 8 及更高版本,这很容易:

    when(mock.process(Matchers.anyList()));
    

    对于 Java 7 及以下版本,编译器需要一些帮助。使用anyListOf(Class<T> clazz)

    when(mock.process(Matchers.anyListOf(Bar.class)));
    

    【讨论】:

    • 注意:这在 Mockito 2.* 中已弃用,并将在 Mockito 3 中删除。已弃用,因为 Java 8 编译器现在可以推断类型。
    • @artbristol 你知道anySet() 是否应该和anyList() 一样工作?我在 Java 8 中,在 Eclipse IDE 中抛出警告
    • 最好使用anyListOf。即使anyList 有效,它也会发出警告。
    • anyListOf 已弃用,因此最好不要使用它。 Java 8 的示例在方法重载的情况下不起作用,例如,如果您有一个接受 2 个不同列表的方法:List<DBEntity>List<DTO> 我已经使用 ArgumentMatchers 和泛型解决了这个问题:when(adapter.adapt(ArgumentMatchers.<DTO>anyList())).thenCallRealMethod();
    【解决方案2】:

    除了上面的anyListOf 之外,您始终可以使用以下语法显式指定泛型:

    when(mock.process(Matchers.<List<Bar>>any(List.class)));
    

    Java 8 新允许基于参数的类型推断,因此如果您使用的是 Java 8,这可能也可以:

    when(mock.process(Matchers.any()));
    

    请记住,any()anyList() 都不会应用任何检查,包括类型或空值检查。在 Mockito 2.x 中,any(Foo.class) 被更改为“任何instanceof Foo”,但any() 仍然表示“包括null 在内的任何值”。

    注意:以上已在较新版本的 Mockito 中切换到 ArgumentMatchers,以避免与 org.hamcrest.Matchers 发生名称冲突。旧版本的 Mockito 需要继续使用org.mockito.Matchers,如上。

    【讨论】:

    • Matchers.any()很方便!
    • Matchers 现已弃用,这是来自 mockito 的信息“使用 ArgumentMatchers。现在弃用此类,以避免与 Hamcrest org.hamcrest.Matchers 类发生名称冲突。此类可能会在3.0版。” static.javadoc.io/org.mockito/mockito-core/2.7.21/org/mockito/…
    • @oddmeter 所做的更改。
    【解决方案3】:

    在 Java 8(版本 7 或 6)之前,我使用新方法 ArgumentMatchers.anyList:

    import static org.mockito.Mockito.*;
    import org.mockito.ArgumentMatchers;
    
    verify(mock, atLeastOnce()).process(ArgumentMatchers.<Bar>anyList());
    

    【讨论】:

    • 完美运行,谢谢
    【解决方案4】:

    我需要带有类型化 ArrayList 的 anyList(),以下方法有效:

    (ArrayList<Bar>) ArgumentMatchers.<Bar>anyList()
    

    【讨论】:

      猜你喜欢
      • 2015-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多