java controller单元测试核心是用mockmvc模拟http请求,不启动完整web容器;推荐@webmvctest注解加载controller及相关web组件并自动配置mockmvc bean,配合@mockbean和verify()验证服务层调用。

Java 中对 Controller 层做单元测试,核心是用 MockMvc 模拟 HTTP 请求,不启动完整 Web 容器,既快又隔离。
依赖和基础配置
确保项目已引入 spring-boot-starter-test(含 MockMvc、JUnit、AssertJ 等):
- Spring Boot 2.5+ 默认使用 JUnit 5,无需
@RunWith;若用 JUnit 4,需加@RunWith(SpringRunner.class) - 测试类放在
src/test/java下,推荐用@WebMvcTest注解——它只加载 Controller 及相关 Web 组件,自动配置 MockMvc Bean,轻量高效 - 如需测试带完整上下文(比如集成某些自定义 Filter 或 Interceptor),可用
@SpringBootTest+@AutoConfigureMockMvc
写一个典型测试用例
假设 Controller 有这样一个 POST 接口:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
@PostMapping("/users")
public ResponseEntity<user> createUser(@RequestBody User user) { ... }</user>
对应测试可这样写:
- 用
@Autowired MockMvc mockMvc发起请求 - 用
MockMvcRequestBuilders.post()构造请求,.contentType(MediaType.APPLICATION_JSON)和.content(jsonString)设置请求体 - 用
.andExpect()验证状态码、响应头、JSON 字段等,例如:status().isOk()、jsonPath("$.name").value("Alice") - 如需验证服务层是否被正确调用,配合
@MockBean UserService userService和 Mockito 的verify()
处理常见场景
实际测试中会遇到这些情况,有对应解法:
-
路径参数/查询参数:用
.param("page", "1")或.pathVariable("id", 123) -
请求头(如 Token):用
.header("Authorization", "Bearer xxx") -
文件上传:用
MockMultipartFile+fileUpload()构建 multipart 请求 -
异常响应(如 400 Bad Request):在 Controller 中用
@ExceptionHandler统一处理,测试时用status().isBadRequest()验证
不建议的做法
避免以下低效或不规范方式:
- 每次测试都启动整个 Spring Boot 应用(用
@SpringBootTest(webEnvironment = RANDOM_PORT))——太慢,属于集成测试范畴 - 手动 new Controller 实例并调用方法——绕过了 Spring 的参数解析、校验、AOP 等关键机制,测不到真实行为
- 用 Postman/cURL 手动测——无法自动化、难回归、不纳入 CI 流程
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










