使用Mockito,我在以下方面遇到了麻烦:
Mockito.when(restOperationMock.exchange(
Mockito.anyString(),
Mockito.any(HttpMethod.class),
Mockito.any(HttpEntity.class),
Mockito.eq(CustomerResponse.class),
**Mockito.anyMap()**)).
thenReturn(re);
问题是该方法没有被拦截,因为我使用的是Mockito.any(Map.class)
而不是Mockito.anyMap()
并且我正在传递一个参数HashMap
。Mockito.any(Map.class)
和Mockito.anyMap()
有什么区别?
any(Map.class)
和 anyMap()
之间只有一个很小的区别:从 Mockito 2.0 开始,Mockito 会将any(Map.class)
调用视为表示isA(Map.class)
,而不是完全忽略参数。(请参阅Mockito贡献者Brice对此SO答案的评论。由于restOperationMock.exchange
采用对象变量,因此您可能需要anyMap
才能捕获传递非 Map 对象或根本不传递任何对象的情况。
(我之前把它作为一个"虚拟值"来返回,Mockito可以返回一个空的Map来调用anyMap()
,但只能返回一个null
来调用any(Map.class)
。如果在存根期间restOperationMock.exchange
委托给真正的实现,例如它是一个间谍或不可模拟的方法(最终方法、最终类上的方法等(,那么该虚拟值可以在实际代码中使用。但是,这仅适用于any()
; anyMap()
和any(Map.class)
都为 Mockito 提供了足够的信息来返回虚拟 Map 实现,其中any()
的泛型被删除,并且只知道足够的信息来返回null
。