如何Mock RestTemplate的exchange方法?遇参数不匹配报错求助
Mock RestTemplate exchange方法时的参数匹配错误解决
问题场景
我尝试Mock RestTemplate的exchange方法,代码如下:
String responseBody = "responseBody"; String url = "http://example.com"; HttpMethod method = HttpMethod.GET; HttpEntity<String> requestEntity = null; Class<String> responseType = String.class; Object[] uriVariables = {}; Map<String, String> headers = Collections.singletonMap("key", "value"); when(restTemplate.exchange(url, HttpMethod.GET, requestEntity, responseType, uriVariables)) .thenReturn(new ResponseEntity<>(responseBody, HttpStatus.OK));
运行时出现如下错误:
Description Resource Path Location Type The method exchange(String, HttpMethod, HttpEntity<?>, Class<T>, Object...) in the type RestTemplate is not applicable for the arguments (String, HttpMethod, HttpEntity<String>, Class<String>, Object[]) line 45 Java Problem
无法定位参数错误原因,求解答。
错误原因与解决方法
错误根源
问题出在最后一个参数uriVariables的类型匹配上:RestTemplate的exchange方法最后一个参数是可变参数Object...,虽然可变参数底层基于数组实现,但直接传递Object[]类型变量时,编译器会将其视为单个数组参数,而非展开成可变参数列表,导致方法签名不匹配。
修复方案
有三种可行的修复方式:
直接传递空可变参数
既然uriVariables是空数组,可直接省略该参数,或显式传递空可变参数:// 省略空可变参数 when(restTemplate.exchange(url, HttpMethod.GET, requestEntity, responseType)) .thenReturn(new ResponseEntity<>(responseBody, HttpStatus.OK));或者:
// 显式传递空参数列表 when(restTemplate.exchange(url, HttpMethod.GET, requestEntity, responseType, new Object[0])) .thenReturn(new ResponseEntity<>(responseBody, HttpStatus.OK));强制将数组转为单个参数传递
如果uriVariables有实际值,不想拆分为可变参数,可将其强制转换为Object类型,让编译器将其视为可变参数的单个元素:when(restTemplate.exchange(url, HttpMethod.GET, requestEntity, responseType, (Object) uriVariables)) .thenReturn(new ResponseEntity<>(responseBody, HttpStatus.OK));使用Mockito匹配器简化匹配
若无需精确匹配参数,使用Mockito的匹配器可规避类型匹配问题:when(restTemplate.exchange(eq(url), eq(HttpMethod.GET), any(HttpEntity.class), eq(String.class), any(Object[].class))) .thenReturn(new ResponseEntity<>(responseBody, HttpStatus.OK));
内容的提问来源于stack exchange,提问作者user4599
相关产品推荐
相关产品推荐

