@webmvctest 配合 mockmvc 可高效完成 web 层集成测试,无需启动完整应用或真实 http 服务,仅加载 controller 及其直接依赖,自动配置嵌入式环境并模拟全链路 mvc 流程。

直接用 @WebMvcTest 配合 MockMvc,就能高效完成 Web 层集成测试,不用启动完整应用,也不依赖真实 HTTP 服务。
明确测试目标和范围
Web 层测试聚焦于 Controller 的行为验证:请求能否正确路由、参数是否被准确解析、响应状态码和内容是否符合预期。它不涉及数据库操作或外部服务调用,这些应由 Service 或 Repository 层测试覆盖。
- 只加载 Controller 及其直接依赖(如 @Service),其他 Bean 默认不加载
- 自动配置嵌入式 Web 环境,无需启动 Tomcat
- 通过 MockMvc 模拟 HTTP 请求,执行全链路 MVC 流程(DispatcherServlet → HandlerMapping → Controller → View/Response)
添加必要依赖和注解
确保 spring-boot-starter-test 已引入(Spring Boot 2.2+ 默认含 JUnit 5 和 MockMvc 支持)。测试类标注 @WebMvcTest,并指定待测 Controller:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 写法示例:
@WebMvcTest(UserController.class) - 若需测试多个 Controller,可用数组:
@WebMvcTest({UserController.class, OrderController.class}) - 如需注入特定 Service 实例(非 mock),可配合
@Import或@ContextConfiguration
注入 MockMvc 并编写请求断言
在测试类中通过 @Autowired 获取 MockMvc 实例,用它构造 GET/POST 等请求,并链式断言响应:
- 基本 GET 请求:
mockMvc.perform(get("/api/users/1")).andExpect(status().isOk()).andExpect(jsonPath("$.name").value("Alice")) - 带 JSON body 的 POST:
mockMvc.perform(post("/api/users").contentType(MediaType.APPLICATION_JSON).content("{\"name\":\"Bob\"}")).andExpect(status().isCreated()) - 验证异常响应:
.andExpect(status().isBadRequest()).andExpect(content().string(containsString("invalid id")))
处理常见依赖场景
Controller 通常依赖 Service,@WebMvcTest 默认会 mock 所有 @Service,无需额外操作。但若需控制 mock 行为:
- 用
@MockBean替换默认 mock,定义返回值或异常:@MockBean private UserService userService; when(userService.findById(1L)).thenReturn(new User("Alice")); - 若 Controller 依赖了非 Service 的组件(如工具类、配置类),可通过
@Import显式加载 - 避免在
@WebMvcTest中使用@SpringBootTest或加载全量上下文,否则失去轻量优势
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










