@WebMvcTest 是 Spring Boot 用于 Web 层单元测试的切片注解,仅加载 Controller 及相关 Web Bean(如 MockMvc、消息转换器),不加载 Service/Repository 等非 Web 组件;需用 @MockBean 替代依赖,并通过 MockMvc 发起 HTTP 请求及断言响应。

@WebMvcTest 是 Spring Boot 提供的专门用于测试 Web 层(Controller)的测试切片注解。它会自动配置 Spring MVC 基础设施(如 MockMvc、@Controller、@RestController、视图解析器、消息转换器等),但**不加载整个应用上下文**,也不扫描或启动 Service、Repository 等其他层组件 —— 这正是它“专注”于 Controller 单元测试的关键所在。
只加载目标 Controller 及其依赖的 Web 相关 Bean
默认情况下,@WebMvcTest 仅扫描并加载被测 Controller 类(及其标注了 @Controller / @RestController 的类),同时自动注入 MockMvc 实例用于发起模拟 HTTP 请求。
- 若只测某个 Controller,可显式指定:
@WebMvcTest(YourController.class) - 不加参数时,默认扫描所有
@Controller类(可能加载多个,注意避免干扰) - 它会跳过
@Service、@Repository、@Component(非 Web 层)等 Bean,除非你手动用@Import或@MockBean引入
用 @MockBean 替代真实 Service/外部依赖
Controller 通常依赖 Service 层。由于 @WebMvcTest 不加载 Service,你需要用 @MockBean 提供模拟实现:
-
@MockBean会将 mock 对象注入到 Spring 测试上下文中,覆盖任何同类型 bean - 例如:
@MockBean private UserService userService;,然后在测试中when(userService.findById(1L)).thenReturn(new User("Alice")); - 注意:不要用
@Mock(来自 Mockito),它只创建普通 mock,不会被 Spring 管理,Controller 注入不到
通过 MockMvc 发起 HTTP 请求并验证响应
MockMvc 是核心测试工具,支持链式调用构建请求、执行、断言:
立即学习“Java免费学习笔记(深入)”;
- 常用写法:
mockMvc.perform(get("/users/1")).andExpect(status().isOk()).andExpect(jsonPath("$.name").value("Alice")); - 支持 GET/POST/PUT/DELETE 等方法,可设置 header、content-type、JSON body(配合
@RequestBody) - 推荐搭配
jsonPath()(需引入spring-boot-starter-test)校验 JSON 响应结构 - 也可用
content().string(...)或content().contentType(...)验证原始响应内容
小心绕过自动配置陷阱
@WebMvcTest 虽轻量,但容易因配置缺失导致测试失败:
- 若 Controller 使用了自定义
@ConfigurationProperties或非 Web 层配置类,需用@Import显式引入 - 若用了全局异常处理器(
@ControllerAdvice),它默认会被加载;如需测试,确保它在扫描范围内或用@Import - 静态资源、Thymeleaf 模板等默认不启用;如需测试视图渲染,要额外配置(例如加
@AutoConfigureTestDatabase不适用,那是 JPA 的) - 避免在测试类上叠加
@SpringBootTest—— 它会覆盖@WebMvcTest的切片行为,变成全量上下文启动
只要明确它只负责 Web 层、合理使用 @MockBean 和 MockMvc,就能写出快速、隔离、可靠的 Controller 单元测试。


















