Skip to content

测试 (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 类,这样可以保证测试的小巧与高效。

Based on Spring Framework.