@webmvctest 是 spring boot 用于测试 web 层(controller)的切片测试注解,仅加载指定 controller 及必需的 mvc 基础设施,不加载 service、repository 等非 web 组件,需配合 @mockbean 模拟依赖,并通过 mockmvc 发起和验证 http 请求。

@WebMvcTest 是 Spring Boot 提供的切片测试注解,专门用于测试 Web 层(Controller),它会自动配置 Spring MVC 基础设施(如 @Controller、@RestController、MessageConverter、WebDataBinder 等),但**不会加载整个应用上下文**,也不会扫描 @Service、@Repository 或其他非 Web 组件。
只加载指定 Controller 类
默认情况下,@WebMvcTest 会扫描并加载所有 @Controller,但通常建议**显式指定要测试的 Controller**,避免意外依赖或测试范围过大:
- 写法:
@WebMvcTest(HelloController.class) - 好处:仅加载该 Controller 及其必需的 Web 相关 Bean(如
MockMvc、视图解析器等),其他 Controller、Service、JPA Bean 全部被排除 - 若不指定,可能因多个 Controller 间隐式依赖(比如共享
@ModelAttribute方法)导致测试失败或行为不可控
用 @MockBean 替换依赖的服务层
Controller 通常调用 Service,而 @WebMvcTest 不加载 Service。你需要用 @MockBean 显式提供模拟实现:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
@MockBean private UserService userService;- 可在测试方法中用
when(userService.findById(1L)).thenReturn(new User("Alice"));定义行为 - 注意:
@MockBean会替换容器中同类型的 Bean;如果 Service 有多个构造器参数,确保 mock 覆盖完整依赖链
通过 MockMvc 发起 HTTP 请求并验证响应
@WebMvcTest 会自动注入 MockMvc 实例,它是测试 Web 层的核心工具:
- 发起 GET 请求:
mockMvc.perform(get("/api/users/1")) - 验证状态码:
.andExpect(status().isOk()) - 验证 JSON 响应体:
.andExpect(jsonPath("$.name").value("Alice"))(需添加spring-boot-starter-test依赖) - 验证响应头、重定向、视图名(对
@Controller返回String视图名时有用)
常见注意事项和补充技巧
实际使用中容易忽略几个关键点:
- 不要在
@WebMvcTest类里加@SpringBootTest或@ContextConfiguration,会破坏切片特性 - 若 Controller 使用了自定义
@Valid校验,需确保LocalValidatorFactoryBean已启用(默认已配好);可加@Import(ValidationConfig.class)手动引入校验配置 - 静态资源、Thymeleaf 模板等默认不生效;如需测试视图渲染,得额外配置(例如加
@AutoConfigureTestDatabase无意义,那是给 JPA 用的) - 想测试异常处理(
@ControllerAdvice),需显式 include:@WebMvcTest(controllers = HelloController.class, useDefaultFilters = false)并配合@Import(MyExceptionHandler.class)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










