菜单

Servlet API 模拟

相关源文件

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

`MockHttpServletRequest` 提供了 `HttpServletRequest` 的完整实现,具有可配置的状态以用于测试场景。它支持所有标准的 HTTP 请求属性以及 Spring 特定的增强功能。

主要功能

功能实现方法
HTTP 方法与 URI可配置的请求行组件`setMethod()`, `setRequestURI()`, `setQueryString()`
参数基于 Map 的参数存储`setParameter()`, `addParameter()`, `setParameters()`
不区分大小写的头部管理`addHeader()`, `getHeader()`, `getHeaders()`
内容支持编码的字节数组内容`setContent()`, `getContentAsByteArray()`, `getContentAsString()`
CookieCookie 数组管理`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

`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/jsonUTF-8自动设置为 UTF-8 编码
application/*+jsonUTF-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

`MockCookie` 扩展了标准的 `Cookie` 类,增加了 RFC 6265 中定义的额外属性,特别是 `SameSite` 属性和增强的 `Expires` 处理。

属性类型目的
SameSite字符串CSRF 保护(`Strict`、`Lax`、`None`)
ExpiresZonedDateTime绝对过期时间
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

额外的模拟组件

MockHttpSession

会话模拟,提供属性管理和适当的绑定事件通知

  • 会话 ID 管理:支持 `changeSessionId()` 的可配置会话 ID
  • 属性生命周期:正确的 `HttpSessionBindingListener` 事件触发
  • 有效期跟踪:会话失效状态管理

来源: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-testorg.springframework.mock.webSpring Test 的主要实现
spring-weborg.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