【问题标题】:Mockito: Verifying with generic parametersMockito:使用泛型参数进行验证
【发布时间】:2011-09-04 18:25:48
【问题描述】:

使用 Mockito,我可以做到以下几点:

verify(someService).process(any(Person.class));

但是如果process 取而代之的是Collection<Person>,我该怎么写呢?无法弄清楚如何正确编写它。只是遇到语法错误...

【问题讨论】:

    标签: java generics parameters verification mockito


    【解决方案1】:

    试试:

    verify(someService).process(Matchers.<Collection<Person>>any());
    

    实际上,当我输入 any() 时,IntelliJ 自动建议了此修复程序...不幸的是,在这种情况下您不能使用静态导入。

    【讨论】:

    • 感谢它的工作...但上帝看起来很可怕,必须有更好的方法来纠正它...
    • 赞许唯一能回答上述问题的解决方案,而不是针对匹配容器的特殊情况。
    • 这个答案现在不正确。下面的答案给出了一个更好的解决方案。
    • 我可能弄错了,但我认为这不是正确的答案。虽然它删除了警告,但验证从“any(Collection.class)”切换到 any(),它不验证任何内容。至少在进行班级检查之前。不是吗?
    • Matchers 已弃用,现在应使用 ArgumentMatchers
    【解决方案2】:

    试试:

    verify(someService).process(anyCollectionOf(Person.class));
    

    自从版本1.8Mockito引入

    public static <T> Collection<T> anyCollectionOf(Class<T> clazz);
    

    【讨论】:

    【解决方案3】:

    如果你使用自己的方法,你甚至可以使用静态导入:

    private Collection<Person> anyPersonCollection() {
        return any();
    }
    

    然后就可以使用了

    verify(someService).process(anyPersonCollection());
    

    【讨论】:

      【解决方案4】:

      作为已接受答案的替代方案,您可以尝试:

      verify(someService).process(Mockito.<SomeGenericClass<Person>>any());
      

      我使用org.mockito.Mockito 而不是Matchers

      【讨论】:

        【解决方案5】:

        由于类型擦除,您无法表达这一点。即使你可以用代码表达它,Mockito 也没有机会在运行时检查它。您可以创建一个类似

        的界面
        interface PersonCollection extends Collection<Person> { /* nothing */ }
        

        而是在整个代码中使用它。

        编辑:我错了,Mockito 有 anyCollectionOf(..) 这是你想要的。

        【讨论】:

        • 实际上,如果 API 接受它,它可以用“类型文字”对象表示:any(new TypeLiteral&lt;Collection&lt;Person&gt;&gt;() {})。当然不漂亮,但它确实有效,因为所有类型信息都在运行时可用(通过反射或字节码库)。
        • @Rogerio:你是对的,现在看来 Mockito 确实支持这一点。好久没用了……
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-17
        • 1970-01-01
        • 1970-01-01
        • 2021-10-06
        • 2011-12-17
        • 1970-01-01
        相关资源
        最近更新 更多