使用Matchers.any()匹配模拟对象

bra*_*yne 2 java tdd mocking matcher mockito

Foo mockFoo1 = mock(Foo.class);
Foo mockFoo2 = mock(Foo.class);
when(((Foo) any()).someMethod()).thenReturn("Hello");
Run Code Online (Sandbox Code Playgroud)

在上面的示例代码中,第3行失败并出现NullPointerException.为什么这样?

我的想法是:

EITHER .. any()应该用于匹配参数,而不是匹配触发方法的对象.

OR .. any()仅适用于真实的具体对象,而不适用于mock对象.

Gar*_*all 7

你需要这样做:

Foo mockFoo1 = mock(Foo.class);
Foo mockFoo2 = mock(Foo.class);
when(mockFoo1).someMethod().thenReturn("Hello");
when(mockFoo2).someMethod().thenReturn("Hello");
Run Code Online (Sandbox Code Playgroud)

any()(anyObject()的较短别名)是一个匹配任何参数的Mockito参数匹配器,只应按如下方式使用:

when(mockFoo1.someMethod(any())).thenReturn("Hello");
Run Code Online (Sandbox Code Playgroud)

any()返回null,因此您的代码等效于

when(((Foo) null).someMethod()).thenReturn("Hello");
Run Code Online (Sandbox Code Playgroud)