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)
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)
由于我需要在我的最新项目中使用此功能(有一点我们从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版中删除。
如果您打算进一步阅读,我已经写了一篇关于模拟通配符的文章。