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

Spring Boot如何Mock RestTemplate.exchange及不生效问题咨询

Mock RestTemplate不生效问题原因与解决方案

核心问题原因

  • 你的Util类的callRestService方法内部每次调用都会主动new一个新的RestTemplate实例,测试类中@Mock注解生成的Mock实例和方法内部创建的实例完全是两个对象,Mock规则自然不会生效。
  • @InjectMocks注解只能将Mock对象注入到目标类的成员变量中,无法作用于方法内部的局部变量。如果方法是静态方法,@InjectMocks也无法生效。
  • 你后续改成非静态方法还是报错,是因为你没有把RestTemplate从方法局部变量改成类成员变量,方法内部还是在自己new实例。

修复方案

步骤1:改造Util类,将RestTemplate改为可注入的成员变量

不要在方法内部初始化RestTemplate,改为通过构造方法注入实例,提升代码可测试性:

public class Util {
    private final RestTemplate restTemplate;

    // 构造方法注入RestTemplate,测试时可直接传入Mock实例
    public Util(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    public ResponseEntity<String> callRestService(JSONObject reqJsonObj,HttpHeaders headers, String url, HttpMethod method, boolean isAuto){
        ResponseEntity<String> re=null;
        try{
            HttpEntity<String> entity=new HttpEntity<>(String.valueOf(reqJsonObj),headers);
            // 使用成员变量的RestTemplate,而非新建实例
            re=restTemplate.exchange(url,method,entity,String.class);
        }catch(Exception e){
            System.out.println(e);
        }
        return re;
    }
}

步骤2:调整测试代码,开启Mockito注解支持

需要添加Mockito运行器/扩展注解,确保Mock注解生效:

// JUnit 5 用这个注解,JUnit 4 替换为@RunWith(MockitoJUnitRunner.class)
@ExtendWith(MockitoExtension.class)
public class UtilTest{
    @Mock
    RestTemplate restTemplate;
    @InjectMocks
    Util util;
    ResponseEntity<String> res = new ResponseEntity<>("anySt",HttpStatus.ACCEPTED);

    @Test
    public void test(){
        Mockito.when(restTemplate.exchange(
                ArgumentMatchers.anyString(),
                ArgumentMatchers.any(HttpMethod.class),
                ArgumentMatchers.any(HttpEntity.class),
                ArgumentMatchers.<Class<String>>any())
        ).thenReturn(res);
        // 调用注入了Mock RestTemplate的util实例方法
        util.callRestService(json,headers,url,HttpMethod.POST,false);
    }
}

特殊场景说明

如果你必须保留原有的静态方法实现,可以使用Mockito 3.4+版本提供的静态方法Mock能力,或者引入PowerMock组件实现静态方法和局部对象的Mock,但这种方式不符合依赖注入最佳实践,更推荐使用上述改造方式。

内容的提问来源于stack exchange,提问作者nongjai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 21:36:02