依赖项注入应该使您的代码对容器的依赖程度低于它 与传统的 J2EE / Java EE 开发。构成应用程序的 POJO 应该可以在 JUnit 或 TestNG 测试中进行测试,使用运算符实例化对象,而无需 Spring 或任何其他容器。您可以使用 mock 对象 (与其他有价值的测试技术结合使用) 来单独测试您的代码。 如果遵循 Spring 的体系结构建议,则生成的 Clean Layering 代码库的组件化有助于更轻松地进行单元测试。例如 您可以通过存根或模拟 DAO 或存储库接口来测试服务层对象, 无需在运行单元测试时访问持久性数据。newspring-doc.cn

真正的单元测试通常运行得非常快,因为没有运行时基础设施 建立。强调真正的单元测试作为开发方法的一部分可以促进 您的工作效率。你可能不需要测试章节的这一部分来帮助你编写 对基于 IoC 的应用程序进行有效的单元测试。对于某些单元测试场景, 但是,Spring 框架提供了 mock 对象和测试支持类,这些 在本章中进行了介绍。spring-doc.cn

Mock 对象

Spring 包含许多专门用于 mock 的包:spring-doc.cn

环境

该包包含 和 abstractions 的模拟实现(参见 Bean 定义配置文件PropertySource 抽象)。 ,并且对开发很有用 容器外测试依赖于特定于环境的属性的代码。org.springframework.mock.envEnvironmentPropertySourceMockEnvironmentMockPropertySourcespring-doc.cn

JNDI

该软件包包含 JNDI 的部分实现 SPI,可用于为测试套件或独立设置简单的 JNDI 环境 应用。例如,如果 JDBC 实例绑定到同一个 JNDI 名称,因此您可以重用这两个应用程序代码 以及测试场景中的配置。org.springframework.mock.jndiDataSourcespring-doc.cn

包中的模拟 JNDI 支持是 从 Spring Framework 5.2 开始正式弃用,取而代之的是 Third 的完整解决方案 Simple-JNDI 等各方。org.springframework.mock.jndi

Servlet API

该软件包包含一套全面的 Servlet API 模拟对象,这些对象对测试 Web 上下文、控制器和过滤器很有用。这些 mock 对象的目标是与 Spring 的 Web MVC 框架一起使用,并且通常更多 比动态 mock 对象(如 EasyMock)更方便使用 或替代 Servlet API 模拟对象(例如 MockObjects)。org.springframework.mock.webspring-doc.cn

从 Spring Framework 6.0 开始,中的 mock 对象是 基于 Servlet 6.0 API。org.springframework.mock.web

Spring MVC 测试框架构建在模拟 Servlet API 对象之上,以提供 Spring MVC 的集成测试框架。请参阅 MockMvcspring-doc.cn

Spring Web 响应式

该包包含 mock 实现 的 Web 应用程序。该软件包包含一个 mock,该 依赖于这些 mock 请求和响应对象。org.springframework.mock.http.server.reactiveServerHttpRequestServerHttpResponseorg.springframework.mock.web.serverServerWebExchangespring-doc.cn

Both 和 extend from the same abstract 基类作为特定于服务器的实现,并与它们共享行为。为 示例,模拟请求一旦创建就不可变,但你可以使用 from 创建修改后的实例。MockServerHttpRequestMockServerHttpResponsemutate()ServerHttpRequestspring-doc.cn

为了使 mock 响应正确实现写入协定并返回 写入完成句柄(即 ),默认情况下,它使用 with ,该句柄缓冲数据并使其可用于测试中的断言。 应用程序可以设置自定义写入函数(例如,测试无限流)。Mono<Void>Fluxcache().then()spring-doc.cn

WebTestClient 基于模拟请求和响应构建,以提供对 在没有 HTTP 服务器的情况下测试 WebFlux 应用程序。客户端还可用于 使用正在运行的服务器进行端到端测试。spring-doc.cn

包中的模拟 JNDI 支持是 从 Spring Framework 5.2 开始正式弃用,取而代之的是 Third 的完整解决方案 Simple-JNDI 等各方。org.springframework.mock.jndi
从 Spring Framework 6.0 开始,中的 mock 对象是 基于 Servlet 6.0 API。org.springframework.mock.web

单元测试支持类

Spring 包含许多可以帮助进行单元测试的类。他们分为两个 类别:spring-doc.cn

通用测试实用程序

该软件包包含几个通用实用程序 用于单元和集成测试。org.springframework.test.utilspring-doc.cn

AopTestUtils 是 与 AOP 相关的实用程序方法。您可以使用这些方法获取对 隐藏在一个或多个 Spring 代理后面的底层目标对象。例如,如果你 通过使用 EasyMock 或 Mockito 等库将 bean 配置为动态模拟, 并且 mock 包装在 Spring 代理中,则可能需要直接访问底层 mock 来配置对它的期望并执行验证。对于 Spring 的核心 AOP 实用工具,请参阅 AopUtilsAopProxyUtilsspring-doc.cn

ReflectionTestUtils 是一个 基于反射的实用程序方法的集合。您可以在测试中使用这些方法 需要更改常量值、设置非字段、 调用非 setter 方法,或调用非 configuration 或 lifecycle callback 方法,例如:publicpublicpublicspring-doc.cn

  • 纵容或字段的 ORM 框架(例如 JPA 和 Hibernate) 访问域实体中属性的 setter 方法。privateprotectedpublicspring-doc.cn

  • Spring 对 Comments(例如 、 、 和 )、 为 OR 字段提供依赖关系注入、setter 方法、 和配置方法。@Autowired@Inject@Resourceprivateprotectedspring-doc.cn

  • 使用 annotations,例如 和 for lifecycle callback 方法。@PostConstruct@PreDestroyspring-doc.cn

TestSocketUtils 是一个简单的 用于查找可用 TCP 端口以用于集成测试的实用程序 场景。localhostspring-doc.cn

TestSocketUtils可用于在 可用的随机端口。但是,这些实用程序不保证后续的 可用性,因此不可靠。建议不要使用 来查找服务器的可用本地端口,而是使用 您依赖于服务器在它选择或所在的随机临时端口上启动的能力 由操作系统分配。要与该服务器交互,您应该查询 server 的端口。TestSocketUtilsspring-doc.cn

Spring MVC 测试实用程序

该包包含 ModelAndViewAssert,您可以 可以与 JUnit、TestNG 或任何其他测试框架结合使用进行单元测试 处理 Spring MVC 对象。org.springframework.test.webModelAndViewspring-doc.cn

对 Spring MVC 控制器进行单元测试
要将 Spring MVC 类作为 POJO 进行单元测试,请使用 Spring 的 Servlet API mock 中的 、 和 等的组合。为了对您的 Spring MVC 和 REST 类与 Spring MVC 的配置结合使用,请改用 Spring MVC 测试框架ControllerModelAndViewAssertMockHttpServletRequestMockHttpSessionControllerWebApplicationContext

TestSocketUtils可用于在 可用的随机端口。但是,这些实用程序不保证后续的 可用性,因此不可靠。建议不要使用 来查找服务器的可用本地端口,而是使用 您依赖于服务器在它选择或所在的随机临时端口上启动的能力 由操作系统分配。要与该服务器交互,您应该查询 server 的端口。TestSocketUtilsspring-doc.cn

对 Spring MVC 控制器进行单元测试
要将 Spring MVC 类作为 POJO 进行单元测试,请使用 Spring 的 Servlet API mock 中的 、 和 等的组合。为了对您的 Spring MVC 和 REST 类与 Spring MVC 的配置结合使用,请改用 Spring MVC 测试框架ControllerModelAndViewAssertMockHttpServletRequestMockHttpSessionControllerWebApplicationContext