Mockito测试RestTemplate exchange方法出现参数匹配器异常
解决Mockito的InvalidUseOfMatchersException异常
咱们先拆解一下你遇到的这个报错:InvalidUseOfMatchersException: Invalid use of argument matchers! 4 matchers expected, 3 recorded,这是Mockito最常出现的问题之一,说白了就是你用参数匹配器的方式违反了它的规则。
问题根源
Mockito有个硬性要求:当你在mock方法调用时使用参数匹配器(比如anyString()、eq()这类),所有参数必须要么全用匹配器,要么全用实际值,绝对不能混着来。
看你代码里的这行mock:
when(restTemplate.exchange(anyString(), HttpMethod.GET, anyObject(), (Class<Object>) anyObject())).thenReturn(stringResponse);
这里有两个关键问题:
- 第二个参数
HttpMethod.GET是实际值,但其他参数用了匹配器,直接违反了“要么全匹配器要么全实际值”的规则; - 第四个参数
(Class<Object>) anyObject()是错误用法——anyObject()是Mockito已经废弃的方法,而且强制转换的方式让Mockito无法识别这是一个有效的匹配器,最终导致它认为你只提供了3个匹配器,但exchange需要4个参数,直接触发报错。
修复方案
按照Mockito的规则调整参数匹配方式,同时替换废弃方法:
- 把实际值
HttpMethod.GET用eq()包裹,转换成匹配器; - 用
any(HttpEntity.class)替换anyObject(),让类型匹配更准确; - 用
any(Class.class)替换(Class<Object>) anyObject(),这是匹配任意Class类型的正确方式。
修正后的完整代码如下:
@Mock private RestTemplate restTemplate; @Test public void getWebDlpPoliciesTest() throws Exception { String responseValue = "{\n" + " \"policies\": [\n" + " {\n" + " \"lastUpdatedBy\": \"15678000\",\n" + " \"lastUpdatedTime\": \"test@gmail.com\",\n" + " \"description\": \"This rule set blocks the transfer of sensitive information outside your organization's network based on DLP Classifications that McAfee maintains and that you can configure.\",\n" + " \"publishedStatus\": \"PUBLISHED\",\n" + " \"enabled\": \"true\",\n" + " \"name\": \"DLP Classification\",\n" + " \"id\": \"DLP_Classification_Rules\"\n" + " }\n" + "\t\t\t\t]\n" + "}"; // 这里把ResponseEntity<Object>改成ResponseEntity<String>,和响应体类型更匹配 ResponseEntity<String> stringResponse = new ResponseEntity<>(responseValue, HttpStatus.OK); // 修正后的mock调用 when(restTemplate.exchange( anyString(), eq(HttpMethod.GET), any(HttpEntity.class), any(Class.class) )).thenReturn(stringResponse); }
额外小提示
- 如果你需要匹配具体的Class类型(比如明确是
String.class),可以把any(Class.class)换成eq(String.class); - 尽量避免使用
anyObject(),Mockito官方已经废弃这个方法了,推荐用any()或者更具体的any(XXX.class)来提升代码可读性和准确性。
内容的提问来源于stack exchange,提问作者madhusudhan
相关产品推荐
相关产品推荐

