Java中Controller层单元测试最常用且推荐的方式是使用MockMvc,它无需启动完整Web容器即可模拟HTTP请求并验证响应,需引入spring-boot-starter-test依赖,支持@WebMvcTest或@SpringBootTest上下文加载及standaloneSetup隔离测试模式。

Java 中对 Controller 层做单元测试,最常用且推荐的方式是使用 MockMvc —— 它是 Spring Test 模块提供的轻量级 Web 层测试工具,无需启动完整 Web 容器,就能模拟 HTTP 请求并验证响应行为。
确保测试依赖已引入
项目中必须包含 spring-boot-starter-test(适用于 Spring Boot),它已内置 MockMvc、JUnit、AssertJ、JsonPath 等关键组件:
- Maven 依赖示例(Spring Boot 3.x 推荐用 JUnit 5):
编写基于 Spring Context 的测试类
使用 @SpringBootTest 启动最小化上下文,再通过 @Autowired WebApplicationContext 构建 MockMvc 实例。这是最贴近真实运行环境的测试方式:
- 测试类需加
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)或默认的MOCK模式(推荐后者,更快) - 在
@BeforeEach中初始化 MockMvc:this.mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); - 静态导入常用工具方法,让代码更简洁:
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
构造请求并断言响应
MockMvc 支持完整的 REST 风格请求模拟,包括路径变量、查询参数、JSON Body、Header、状态码、响应体内容等:
立即学习“Java免费学习笔记(深入)”;
- GET 请求示例(带 query 参数):
mockMvc.perform(get("/api/users").param("page", "1"))<br> .andExpect(status().isOk())<br> .andExpect(jsonPath("$.data.length()").value(10)); - POST 请求示例(JSON Body):
mockMvc.perform(post("/api/users/register")<br> .contentType(MediaType.APPLICATION_JSON)<br> .content("{\"name\":\"Alice\",\"email\":\"a@example.com\"}"))<br> .andExpect(status().isCreated())<br> .andExpect(content().string(containsString("registered"))); - 验证异常响应(如 400 Bad Request):
.andExpect(status().isBadRequest())
可选:隔离 Controller,不加载全量上下文
若只想测单个 Controller 且不依赖其他 Bean(比如 Service 尚未就绪),可用 standaloneSetup 模式:
- 手动注入 mock 服务:
UserService mockService = mock(UserService.class);when(mockService.registerUser(any())).thenReturn(true); - 构建 MockMvc:
mockMvc = MockMvcBuilders.standaloneSetup(new UserController(mockService))<br> .setControllerAdvice(new GlobalExceptionHandler())<br> .build();
- 适合快速验证 Controller 路由、参数绑定、校验注解(@Valid)、异常处理器等逻辑


















