此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Framework 6.2.6

单元测试

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

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

Mock 对象

Spring 包含许多专门用于 mock 的包:

环境

org.springframework.mock.envpackage 包含EnvironmentPropertySourceabstractions 中(参见 Bean 定义配置文件PropertySource抽象化).MockEnvironmentMockPropertySource对于开发很有用 容器外测试依赖于特定于环境的属性的代码。

Servlet API

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

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

MockMvc 构建在模拟 Servlet API 对象之上,以提供集成测试 框架。请参阅 MockMvc

Spring Web 响应式

org.springframework.mock.http.server.reactivepackage 包含 mock 实现 之ServerHttpRequestServerHttpResponse用于 WebFlux 应用程序。这org.springframework.mock.web.serverpackage 包含一个 mockServerWebExchange那 依赖于这些 mock 请求和响应对象。

MockServerHttpRequestMockServerHttpResponse从同一摘要中扩展 基类作为特定于服务器的实现,并与它们共享行为。为 例如,模拟请求在创建后是不可变的,但您可以使用mutate()方法 从ServerHttpRequest以创建修改后的实例。

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

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

单元测试支持类

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

通用测试实用程序

org.springframework.test.utilpackage 包含几个通用实用程序 用于单元和集成测试。

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

ReflectionTestUtils是一个 基于反射的实用程序方法的集合。您可以在测试中使用这些方法 需要更改常量值的情况下,请将非public田 调用非publicsetter 方法,或调用非 -public配置或生命周期 callback 方法,例如:

  • 纵容privateprotected田 访问,而不是public域实体中属性的 setter 方法。

  • Spring 对注解(例如@Autowired,@Inject@Resource), 为privateprotected字段、setter 方法、 和配置方法。

  • 使用注释,例如@PostConstruct@PreDestroy对于生命周期回调 方法。

TestSocketUtils是一个简单的 用于查找可用 TCP 端口的实用程序localhost用于集成测试 场景。

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

Spring MVC 测试实用程序

org.springframework.test.web软件包包含ModelAndViewAssert,而您 可以与 JUnit、TestNG 或任何其他测试框架结合使用进行单元测试 处理 Spring MVCModelAndView对象。

单元测试 Spring MVC 控制器
对 Spring MVC 进行单元测试Controller类作为 POJO 时,请使用ModelAndViewAssert结合MockHttpServletRequest,MockHttpSession等等。为了对您的 Spring MVC 和 RESTController类与您的WebApplicationContext对于 Spring MVC,请使用 MockMvc

APP信息