Mockito和Mockito.any(Map.class)

时间:2016-02-16 15:54:07

标签: hashmap mockito

使用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()之间有什么区别?

1 个答案:

答案 0 :(得分:9)

any(Map.class)anyMap()之间只有一个小差异:从Mockito 2.0开始,Mockito会将any(Map.class)调用视为isA(Map.class)而不是完全忽略参数。 (请参阅Mockito撰稿人Brice对this SO answer的评论。)因为restOperationMock.exchange takes an Object vararg,您可能需要anyMap来捕获传递非Map对象的情况,或者根本没有对象通过了。

(我以前把它作为"虚拟值"要返回,Mockito可以返回一个空地图来调用anyMap(),但只能返回null调用any(Map.class)。如果restOperationMock.exchange在存根期间委托给一个真正的实现,比如它是间谍或不可篡改的方法(最终方法,最后一个类的方法等),那么那个虚拟值可以在实际代码中使用。但是,这仅适用于any(); anyMap()any(Map.class)两者都为Mockito提供了足够的信息来返回虚拟Map实现,其中{{ 1}}已删除其泛型,只知道返回any()。)