Spring Framework 提供了一整套 Jakarta Servlet API 的模拟实现,以便在无需真实 Servlet 容器的情况下方便地对 Web 应用程序进行单元测试。这些模拟使开发人员能够独立测试 Spring MVC 控制器、过滤器和其他 Web 组件。
有关响应式 Web 测试的信息,请参阅响应式 Web 测试。有关通用测试基础设施,请参阅测试。
Servlet API 模拟围绕核心 Servlet 接口组织,提供了完整的实现,能够维护适用于测试场景的状态和行为。
来源:spring-test/src/main/java/org/springframework/mock/web/package-info.java1-11 spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java77-95 spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java55-68
`MockHttpServletRequest` 提供了 `HttpServletRequest` 的完整实现,具有可配置的状态以用于测试场景。它支持所有标准的 HTTP 请求属性以及 Spring 特定的增强功能。
| 功能 | 实现 | 方法 |
|---|---|---|
| HTTP 方法与 URI | 可配置的请求行组件 | `setMethod()`, `setRequestURI()`, `setQueryString()` |
| 参数 | 基于 Map 的参数存储 | `setParameter()`, `addParameter()`, `setParameters()` |
| 头 | 不区分大小写的头部管理 | `addHeader()`, `getHeader()`, `getHeaders()` |
| 内容 | 支持编码的字节数组内容 | `setContent()`, `getContentAsByteArray()`, `getContentAsString()` |
| Cookie | Cookie 数组管理 | `setCookies()`, `getCookies()` |
| 会话 | 关联的模拟会话 | `getSession()`, `setSession()` |
| 属性 | 请求范围的属性存储 | `setAttribute()`, `getAttribute()` |
模拟请求使用合理的默认值进行初始化,以便进行测试
来源:spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java120-156 spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java313-318
模拟请求处理内容时支持正确的字符编码。内容可以设置为字节数组,并使用配置的编码作为字符串检索。
来源:spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java411-449 spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java387-401
`MockHttpServletResponse` 捕获应用程序代码写入的响应数据,从而能够验证响应内容、头部和状态码。
来源:spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java98-135 spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java871-936
响应模拟处理字符编码时,对 JSON 内容类型有特殊支持
| 内容类型模式 | 默认编码 | 行为 |
|---|---|---|
application/json | UTF-8 | 自动设置为 UTF-8 编码 |
application/*+json | UTF-8 | 自动设置为 UTF-8 编码 |
| 其他类型 | ISO-8859-1 | 使用默认或显式设置的编码 |
来源:spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java350-376 spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java76-77
模拟响应根据缓冲区大小和显式刷新来跟踪提交状态
来源:spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java404-409 spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java871-936
`MockCookie` 扩展了标准的 `Cookie` 类,增加了 RFC 6265 中定义的额外属性,特别是 `SameSite` 属性和增强的 `Expires` 处理。
| 属性 | 类型 | 目的 |
|---|---|---|
SameSite | 字符串 | CSRF 保护(`Strict`、`Lax`、`None`) |
Expires | ZonedDateTime | 绝对过期时间 |
Partitioned | 布尔值 | 用于隐私的 Cookie 分区 |
`MockCookie` 包含一个用于解析 `Set-Cookie` 头部值的静态工厂方法
来源:spring-test/src/main/java/org/springframework/mock/web/MockCookie.java134-183 spring-test/src/main/java/org/springframework/mock/web/MockCookie.java55-104
会话模拟,提供属性管理和适当的绑定事件通知
来源:spring-test/src/main/java/org/springframework/mock/web/MockHttpSession.java48-99 spring-test/src/main/java/org/springframework/mock/web/MockHttpSession.java162-216
这些模拟通过 `PrintingResultHandler` 与 Spring 的测试基础设施集成,以进行详细的请求/响应调试。
来源:spring-test/src/main/java/org/springframework/test/web/servlet/result/PrintingResultHandler.java112-157 spring-test/src/main/java/org/springframework/test/web/servlet/result/PrintingResultHandler.java246-289
Servlet 模拟存在于两个位置
| 模块 | 包 | 目的 |
|---|---|---|
spring-test | org.springframework.mock.web | Spring Test 的主要实现 |
spring-web | org.springframework.web.testfixture.servlet | 用于 Web 模块测试的测试夹具 |
这些实现功能上相同,其中 `spring-web` 版本用作 Web 模块本身的测试夹具。
来源:spring-test/src/main/java/org/springframework/mock/web/package-info.java1-11 spring-web/src/testFixtures/java/org/springframework/web/testfixture/servlet/MockHttpServletRequest.java77-95