推荐使用@springboottest配合testresttemplate或webtestclient进行rest接口集成测试:前者适用于webmvc应用并启动真实http服务器,后者更轻量且支持声明式断言;若仅测controller层,可用@webmvctest加速测试。

在 Spring Boot 中为 REST 接口编写集成测试,推荐使用 @SpringBootTest 配合 TestRestTemplate 或 WebTestClient,它们能启动真实(或精简)的 Web 环境,验证控制器逻辑、请求映射、状态码、响应体、异常处理等端到端行为。
使用 @SpringBootTest + TestRestTemplate
适合大多数基于 WebMvc 的应用,自动配置嵌入式容器(如 Tomcat),发起真实 HTTP 请求:
- 在测试类上添加
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT),让 Spring Boot 启动一个随机可用端口的服务器 - 注入
TestRestTemplate(无需手动配置,Spring Boot 自动提供),它封装了RestTemplate并支持基础认证、默认头等便捷功能 - 用
getForObject()、postForEntity()等方法调用接口,然后断言响应状态码、JSON 字段、HTTP 头等
示例:
@Autowiredprivate TestRestTemplate restTemplate;
@Test
void shouldReturnUserById() {
ResponseEntity
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
assertThat(response.getBody().getName()).isEqualTo("Alice");
}
使用 @SpringBootTest + WebTestClient(推荐用于 WebFlux 或纯响应式风格)
即使项目是 WebMvc,WebTestClient 也更轻量、非阻塞、支持链式断言和 JSON 路径解析,且可不启动完整容器(通过 webEnvironment = SpringBootTest.WebEnvironment.MOCK):
- 搭配
@AutoConfigureWebTestClient注解,自动注入WebTestClient - 用
get().uri(...).exchange()发起请求,再用.expectStatus().isOk()、.expectBody().jsonPath("$.name").isEqualTo("Alice")等做声明式断言 - 支持模拟安全上下文、自定义请求头、表单提交、文件上传等复杂场景
只测 Controller 层:用 @WebMvcTest(单元级集成测试)
如果只想验证控制器逻辑、参数绑定、校验、返回值转换,而不想加载整个应用上下文,用 @WebMvcTest 更快:
- 它仅加载 Web 相关 Bean(如
@Controller、@RestController、Converter、Validator),跳过 Service、Repository 等 - 配合
@MockBean替换依赖的服务,隔离测试边界 - 注入
MockMvc实例,通过构建请求(mockMvc.perform(get("/api/users/1")))执行并断言
注意:@WebMvcTest 不启动 HTTP 服务器,所有请求走内部 Servlet 容器模拟,不经过网络栈。
测试异常与错误响应
确保全局异常处理器(如 @ControllerAdvice)在测试中生效:
- 在
@SpringBootTest或@WebMvcTest下,只要异常处理器类被扫描到,就会参与处理 - 故意触发异常(如传非法 ID、违反 @Valid 约束),检查是否返回预期状态码(如 400、500)和结构化错误体
- 用
.expectBody(String.class).value(containsString("Invalid ID"))或解析 JSON 错误字段验证内容
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











