测试 (Testing)
本节总结了 spring-test 为 Spring MVC 应用程序提供的选项。
- Servlet API Mocks: Servlet API 契约的 Mock 实现,用于对 Controller、过滤器和其他 Web 组件进行单元测试。详情请参阅 Servlet API Mock 对象。
- TestContext 框架: 支持在 JUnit 和 TestNG 测试中加载 Spring 配置,包括在测试方法间高效缓存已加载的配置,以及支持使用
MockServletContext加载WebApplicationContext。详情请参阅 TestContext 框架。 - Spring MVC Test: 一个也被称为
MockMvc的框架,用于通过DispatcherServlet测试带注解的控制器(即支持各种注解),配备了完整的 Spring MVC 基础设施,但不需要 HTTP 服务器。详情请参阅 Spring MVC Test。 - 客户端 REST:
spring-test提供了一个MockRestServiceServer,你可以将其用作 Mock 服务器,来测试内部使用RestTemplate的客户端代码。详情请参阅 客户端 REST 测试。 WebTestClient: 专为测试 WebFlux 应用程序而构建,但它也可用于通过 HTTP 连接对任何服务器进行端到端集成测试。它是一个非阻塞的响应式客户端,非常适合测试异步和流式处理场景。详情请参阅WebTestClient。
补充教学
1. MockMvc vs Integration Test
- MockMvc: 重点在于“模拟”。它不启动真实的内置 Tomcat 容器。请求被直接喂给
DispatcherServlet。速度极快,适合验证 Controller 的逻辑、路径绑定和数据校验。 - End-to-End (WebTestClient): 通常配合
@SpringBootTest(webEnvironment = RANDOM_PORT)使用。它会启动一个真实监听端口的服务。适合验证整个链路(包括过滤器、安全策略、数据库实际连接等)的正确性。
2. 测试的最佳实践
在大多数 Spring MVC 项目中,MockMvc 是最常用的手段。建议通过 @WebMvcTest 注解锁定特定的 Controller 进行切片测试,并使用 @MockBean 模拟底层的 Service 类,这样可以保证测试的小巧与高效。