You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何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[]类型变量时,编译器会将其视为单个数组参数,而非展开成可变参数列表,导致方法签名不匹配。

修复方案

有三种可行的修复方式:

  1. 直接传递空可变参数
    既然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));
    
  2. 强制将数组转为单个参数传递
    如果uriVariables有实际值,不想拆分为可变参数,可将其强制转换为Object类型,让编译器将其视为可变参数的单个元素:

    when(restTemplate.exchange(url, HttpMethod.GET, requestEntity, responseType, (Object) uriVariables))
        .thenReturn(new ResponseEntity<>(responseBody, HttpStatus.OK));
    
  3. 使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 14:15:36