本文档涵盖了 Spring Framework 对 Web 应用程序全面的测试支持。它侧重于两种主要的测试方法:面向传统 Web 应用程序的 Servlet API 的模拟实现,以及面向 WebFlux 应用程序的响应式 Web 测试工具。
有关测试中的通用 Spring 测试概念,例如依赖注入,请参阅核心组件。有关构建系统和测试配置,请参阅构建与开发。
Spring 的测试支持提供了一套完整的工具,用于测试 Web 应用程序,而无需运行服务器。该框架同时为传统的 Spring MVC 应用程序提供了基于 Servlet 的模拟,也为 WebFlux 应用程序提供了响应式测试功能。
来源: spring-test/src/main/java/org/springframework/test/web/reactive/server/WebTestClient.java1-550 spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java1-100 spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java1-100
测试框架由几个关键的架构层组成,它们协同工作以提供全面的 Web 测试功能
来源: spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClient.java70-130 spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClientBuilder.java50-110 spring-test/src/main/java/org/springframework/test/web/reactive/server/WiretapConnector.java50-100
Spring 提供了完整的 Servlet API 模拟实现,使您无需 Servlet 容器即可测试 Web 组件。这些模拟主要位于 org.springframework.mock.web 包中。
Servlet 模拟框架围绕三个主要类展开
| 类 | 目的 | 主要功能 |
|---|---|---|
MockHttpServletRequest | Mock HTTP 请求 | 参数、头信息、Cookie、内容 |
MockHttpServletResponse | Mock HTTP 响应 | 状态、头信息、内容捕获 |
MockCookie | 增强的 Cookie 实现 | SameSite、Partitioned 属性 |
MockHttpServletRequest 类提供了全面的模拟实现,支持所有标准的 Servlet 请求功能
关键配置方法包括 setMethod()、setRequestURI()、setContent()、addParameter() 和 addHeader()。该类通过 spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java508-569 支持参数和基于内容的请求正文处理
来源: spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java95-320 spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java508-625
MockHttpServletResponse 捕获响应数据并提供断言方法
如 spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java350-376 所示,响应模拟会自动处理字符编码、内容类型解析和 Cookie 管理。
来源: spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java68-130 spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java279-320
MockCookie 扩展了标准的 Cookie 类,支持现代 Cookie 属性
setSameSite() 和 getSameSite() 支持 SameSite 属性setPartitioned() 和 isPartitioned() 支持 Partitioned 属性ZonedDateTimeparse()解析实现处理复杂的 Cookie 语法,如 spring-test/src/main/java/org/springframework/mock/web/MockCookie.java134-183 所示。
来源: spring-test/src/main/java/org/springframework/mock/web/MockCookie.java41-130 spring-test/src/main/java/org/springframework/mock/web/MockCookie.java134-196
Spring 的响应式 Web 测试以 WebTestClient 为中心,它提供了一个用于测试 WebFlux 应用程序的流畅 API。该客户端可以在模拟模式下(无服务器)运行,或连接到正在运行的服务器。
来源: spring-test/src/main/java/org/springframework/test/web/reactive/server/WebTestClient.java175-254 spring-test/src/main/java/org/springframework/test/web/reactive/server/WebTestClient.java822-926
流畅的 API 指导用户完成请求构建
UriSpec,使用 uri(String, Object...) 和 uri(URI) 等方法RequestHeadersSpec,使用 header()、accept()、cookie() 方法RequestBodySpec,使用 bodyValue()、body() 和内容类型方法请求构建过程在 spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClient.java188-424 中实现
来源: spring-test/src/main/java/org/springframework/test/web/reactive/server/WebTestClient.java554-817 spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClient.java188-300
WebTestClient 通过 ResponseSpec 接口提供了全面的断言能力
来源: spring-test/src/main/java/org/springframework/test/web/reactive/server/StatusAssertions.java35-80 spring-test/src/main/java/org/springframework/test/web/reactive/server/HeaderAssertions.java48-200 spring-test/src/main/java/org/springframework/test/web/reactive/server/WebTestClient.java822-1000
该结果系统捕获完整的请求/响应信息
通过 ExchangeResult 中实现的 assertWithDiagnostics() 方法,ExchangeResult 提供诊断信息和断言支持
来源: spring-test/src/main/java/org/springframework/test/web/reactive/server/ExchangeResult.java214-225 spring-test/src/main/java/org/springframework/test/web/reactive/server/ExchangeResult.java58-130 spring-test/src/main/java/org/springframework/test/web/reactive/server/ExchangeResult.java130-280
该 WiretapConnector 拦截并捕获实际的 HTTP 流量以进行测试
ClientHttpConnector 以捕获请求/响应数据WebTestClient.WEBTESTCLIENT_REQUEST_ID 头按键存储交换信息ExchangeResult 实例窃听机制通过请求和响应装饰器实现,如 spring-test/src/main/java/org/springframework/test/web/reactive/server/WiretapConnector.java64-86所示
来源: spring-test/src/main/java/org/springframework/test/web/reactive/server/WiretapConnector.java52-100 spring-test/src/main/java/org/springframework/test/web/reactive/server/WiretapConnector.java88-100