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

如何编写JUnit测试用例测试Spring Boot Rest Client?

实现方案

Spring 生态已经提供了官方专用的测试工具MockRestServiceServer,不需要启动真实服务,就能直接拦截 Rest 客户端发出的所有请求,校验请求参数、请求体等信息是否符合预期。

前置依赖

只要引入 Spring Boot 测试起步依赖即可,无需额外导入其他包:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

测试用例编写示例

假设你自行封装的 Rest 客户端类为CustomRestClient,内部使用RestTemplate/Spring 6.1+ 新的RestClient发起请求,测试代码如下:

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.test.web.client.MockRestServiceServer;
import static org.springframework.test.web.client.match.MockRestRequestMatchers.*;
import static org.springframework.test.web.client.response.MockRestResponseCreators.withSuccess;
import static org.junit.jupiter.api.Assertions.*;

// 不需要加载完整Spring上下文的话可以去掉@SpringBootTest注解,手工初始化对象即可
public class CustomRestClientTest {

    private MockRestServiceServer mockServer;
    private CustomRestClient customRestClient;

    @BeforeEach
    void setUp() {
        // 手工初始化客户端和绑定Mock服务,不需要启动Spring上下文
        RestTemplate restTemplate = new RestTemplate();
        customRestClient = new CustomRestClient(restTemplate);
        mockServer = MockRestServiceServer.bindTo(restTemplate).build();
        
        // 如果用的是Spring 6.1+的新RestClient,绑定逻辑替换为:
        // RestClient restClient = RestClient.create();
        // customRestClient = new CustomRestClient(restClient);
        // mockServer = MockRestServiceServer.bindTo(restClient).build();
    }

    @Test
    void 校验POST请求参数和请求体是否正确() {
        // 构造测试请求参数
        User requestUser = new User("张三", 25);

        // 配置拦截规则和模拟返回值
        mockServer.expect(requestTo("https://api.target.com/users")) // 校验请求完整URL
                .andExpect(method(HttpMethod.POST)) // 校验请求方法
                .andExpect(header("Content-Type", MediaType.APPLICATION_JSON_VALUE)) // 校验请求头
                .andExpect(jsonPath("$.name").value("张三")) // 校验请求体指定字段
                .andExpect(jsonPath("$.age").value(25))
                .andRespond(withSuccess("{\"id\":1,\"name\":\"张三\",\"age\":25}", MediaType.APPLICATION_JSON));

        // 调用你封装的Rest客户端方法
        User result = customRestClient.createUser(requestUser);

        // 验证所有预设的校验规则都被命中,请求符合预期
        mockServer.verify();
        // 可选校验返回值解析是否正确
        assertEquals(1, result.getId());
    }

    @Test
    void 校验GET请求路径参数和查询参数是否正确() {
        mockServer.expect(requestToUriTemplate("https://api.target.com/users/{id}", 1)) // 校验路径参数
                .andExpect(method(HttpMethod.GET))
                .andExpect(queryParam("status", "active")) // 校验查询参数
                .andRespond(withSuccess("{\"id\":1,\"name\":\"张三\",\"status\":\"active\"}", MediaType.APPLICATION_JSON));

        User result = customRestClient.getUserById(1L, "active");

        mockServer.verify();
        assertEquals("active", result.getStatus());
    }
}

支持的校验项

你可以根据需求选择对应校验方法:

  • URL校验:支持精确字符串匹配、URI模板匹配、正则匹配
  • 请求方法校验
  • 请求头校验
  • 路径参数校验
  • 查询参数校验
  • 请求体校验:支持完整内容匹配、jsonPath字段匹配、xpath匹配,也可以自定义RequestMatcher实现复杂校验逻辑

如果你的Rest客户端基于WebClient实现,可以用MockWebServer完成相同的拦截校验逻辑,该工具也已经包含在spring-boot-starter-test依赖中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 16:45:02