使用Mockito的通用"any()"方法

rip*_*234 181 java unit-testing mocking mockito

我有一个接口,其方法需要一个数组Foo:

public interface IBar {
  void doStuff(Foo[] arr);
}
Run Code Online (Sandbox Code Playgroud)

我正在使用Mockito来嘲笑这个界面,我想断言它doStuff()被调用了,但我不想验证传递了什么参数 - "不关心".

如何使用any()泛型方法编写以下代码,而不是anyObject()

IBar bar = mock(IBar.class);
...
verify(bar).doStuff((Foo[]) anyObject());
Run Code Online (Sandbox Code Playgroud)

jit*_*ter 267

这应该工作

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.verify;

verify(bar).DoStuff(any(Foo[].class));
Run Code Online (Sandbox Code Playgroud)

  • 以防有人在Scala中需要它:`verify(bar).DoStuff(any [Array [Foo]])` (31认同)
  • 我在导入时遇到问题,我在我的导入中使用了来自hamcrest的any(),并且它与来自mockito的那个相撞. (6认同)
  • 请查看API,类参数仅用于转换,该方法仍然接受任何类型的对象!http://site.mockito.org/mockito/docs/current/org/mockito/Matchers.html#any(java.lang.Class).在这种情况下使用isA()http://site.mockito.org/mockito/docs/current/org/mockito/Matchers.html#isA(java.lang.Class). (3认同)
  • 为了避免与 Hamcrest 的名称冲突,这个类现在已被弃用。使用 org.mockito.ArgumentMatchers (3认同)

Lii*_*Lii 95

从Java 8开始,您可以使用无参数any方法,并且类型参数将由编译器推断:

verify(bar).doStuff(any());
Run Code Online (Sandbox Code Playgroud)

说明

Java 8中的新功能是表达式的目标类型将用于推断其子表达式的类型参数.在Java 8之前,只有用于类型参数推断的方法的参数(大多数时候).

在这种情况下,参数类型doStuff将是目标类型any(),并且any()将选择返回值类型以匹配该参数类型.


原始类型

不幸的是,这不适用于原始类型:

public interface IBar {
    void doPrimitiveStuff(int i);
}

verify(bar).doPrimitiveStuff(any()); // Compiles but throws NullPointerException
verify(bar).doPrimitiveStuff(anyInt()); // This is what you have to do instead
Run Code Online (Sandbox Code Playgroud)

问题是编译器会推断Integer为返回值any().Mockito不会意识到这一点(由于类型擦除)并返回引用类型的默认值,即null.运行时将尝试通过intValue在传递它之前调用其上的方法来取消返回值doStuff,并抛出异常.


thi*_*lko 10

你可以用Mockito.isA()它:

import static org.mockito.Matchers.isA;
import static org.mockito.Mockito.verify;

verify(bar).doStuff(isA(Foo[].class));
Run Code Online (Sandbox Code Playgroud)

http://site.mockito.org/mockito/docs/current/org/mockito/Matchers.html#isA(java.lang.Class)

  • @SurasinTancharoen实际上,any(Class)仅仅是isA(Class)的别名(请参阅文档)。因此,这完全没有错。 (3认同)

Mac*_*ski 5

由于我需要在我的最新项目中使用此功能(有一点我们从1.10.19进行了更新),只是为了使用户(已经在使用模仿核心版本2.1.0或更高版本)保持最新,因此上述答案中的方法应从ArgumentMatchers类中获取:

import static org.mockito.ArgumentMatchers.isA;
import static org.mockito.ArgumentMatchers.any;
Run Code Online (Sandbox Code Playgroud)

如果您计划从版本3开始更新Mockito制品,请记住这一点,此类可能不再存在:

根据2.1.0及更高版本,org.mockito.Matchers的Javadoc指出:

使用org.mockito.ArgumentMatchers。现在不推荐使用该类,以避免与Hamcrest * org.hamcrest.Matchers 类发生名称冲突。此类可能会在3.0版中删除。

如果您打算进一步阅读,我已经写了一篇关于模拟通配符的文章。