spring boot rest接口mock测试核心是mockmvc,通过@webmvctest加载web层并自动注入mockmvc,用@mockbean模拟依赖服务,perform发起请求,andexpect断言响应。

Spring Boot 中 REST 接口的 Mock 测试,核心是用 MockMvc 在不启动真实 Web 容器的前提下,完整模拟 HTTP 请求 → Controller → 返回响应的链路。它轻量、快速、可断言,适合单元测试和 CI 流程。
基础测试类配置
使用 @WebMvcTest 是最推荐的方式,它只加载 Web 层(Controller、Converter、Advice 等),不加载 Service、Repository 或数据库,启动快、隔离性好:
- 在测试类上标注
@WebMvcTest(YourController.class),或不指定参数以加载所有 Controller - 自动注入
MockMvc实例,无需手动构建 - 若需模拟依赖服务(如 Service),用
@MockBean替换 Spring 容器中的真实 Bean - 确保引入
spring-boot-starter-test(含 JUnit 5、Mockito、AssertJ、JSONassert 等)
构造并执行典型请求
以 GET /api/users/{id} 为例,常见写法如下:
- 用
mockMvc.perform(get("/api/users/123"))发起请求 - 添加路径变量:
.param("id", "123")(对 query 参数)或.pathVariable("id", "123")(新版支持,更语义化) - 发送 JSON 请求体(如 POST):
post("/api/users").contentType(MediaType.APPLICATION_JSON).content("{\"name\":\"Alice\"}") - 设置 Accept 头:
.accept(MediaType.APPLICATION_JSON)
断言响应结果
通过 .andExpect(...) 验证状态、内容、头信息等:
- 状态码:
status().isOk()、status().isNotFound()、status().isBadRequest() - 响应体文本:
content().string("Hello Alice")(适合纯文本) - 响应体 JSON:
jsonPath("$.name").value("Alice")(需引入json-path) - 响应头:
header().string("Content-Type", "application/json;charset=UTF-8") - 调试时加
.andDo(print())输出完整请求/响应日志
处理依赖与边界场景
Controller 往往调用 Service,真实调用会破坏测试隔离性,应主动 Mock:
- 用
@MockBean UserService userService;替换容器中 UserService 实例 - 预设行为:
when(userService.findById(123L)).thenReturn(new User("Alice")); - 验证是否被调用:
verify(userService).findById(123L); - 测试异常路径:用
when(...).thenThrow(new RuntimeException()),再断言返回 500 或自定义错误体











