spring boot rest接口单元测试首选@webmvctest,用mockmvc模拟请求并验证状态码、json响应等;通过@mockbean隔离service依赖,避免启动全量上下文。

Spring Boot 中 REST 接口单元测试主要围绕 Controller 层 展开,核心是用 MockMvc 模拟 HTTP 请求,验证接口行为是否符合预期——包括状态码、响应内容、JSON 结构等。不启动真实 Web 容器,速度快、隔离性好。
选对测试注解:@WebMvcTest 最常用
推荐优先使用 @WebMvcTest,它只加载 Web 层组件(如 @Controller、@RestController、@JsonComponent),自动忽略 @Service、@Repository 等非 Web Bean,避免全量上下文启动,测试更轻量、更聚焦。
- 指定测试目标控制器:
@WebMvcTest(UserController.class) - 若需模拟依赖服务,用
@MockBean替换真实实现(例如@MockBean UserService userService) - 无需手动构建
MockMvc,它会自动注入到测试类中
构造请求并断言响应
使用 mockMvc.perform(...) 发起模拟请求,链式调用 andExpect(...) 验证结果:
- 检查 HTTP 状态:
.andExpect(status().isOk())、.andExpect(status().isNotFound()) - 校验 JSON 响应体:
.andExpect(jsonPath("$.name").value("Alice"))、.andExpect(jsonPath("$.[0].id").value(1)) - 验证响应头或内容类型:
.andExpect(content().contentType(MediaType.APPLICATION_JSON)) - GET 请求带参数:
get("/users").param("page", "1").param("size", "10") - POST/PUT 提交 JSON:
post("/users").content(asJsonString(user)).contentType(MediaType.APPLICATION_JSON)(需自定义asJsonString()方法,内部用ObjectMapper序列化)
处理依赖与数据模拟
Controller 通常调用 Service,而 Service 又依赖 DAO 或外部服务。单元测试中应切断这些真实依赖:
- 用
@MockBean替换 Service 实现,控制返回值:when(userService.findById(1L)).thenReturn(new User(1L, "Tom", 25)) - 避免在测试中操作真实数据库;如需验证完整流程(含 DB),改用
@DataJpaTest或集成测试注解 - 异常路径也要覆盖:比如传入非法 ID 时,应返回 400 或 404,并检查错误消息结构
基础依赖和准备
确保 pom.xml 中已引入测试起步依赖:
- Maven:
<dependency><groupid>org.springframework.boot</groupid><artifactid>spring-boot-starter-test</artifactid><scope>test</scope></dependency> - 测试类放在
src/test/java,资源文件(如测试用 JSON)放src/test/resources - 建议为 JSON 转换封装工具方法(如
objectMapper.writeValueAsString(obj)),提升可读性
不复杂但容易忽略:测试前确认 Controller 的 URL 映射(@RequestMapping 或 @GetMapping)与测试中写的路径完全一致,注意斜杠、路径变量占位符(如 {id})和实际传值的匹配。











