此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Framework 6.2.0! |
单元测试
依赖项注入应该使您的代码对容器的依赖程度低于它
与传统的 J2EE / Java EE 开发。构成应用程序的 POJO
应该可以在 JUnit 或 TestNG 测试中进行测试,对象通过使用new
运算符,没有 Spring 或任何其他容器。您可以使用 mock 对象 (与其他有价值的测试技术结合使用) 来单独测试您的代码。
如果遵循 Spring 的体系结构建议,则生成的 Clean Layering
代码库的组件化有助于更轻松地进行单元测试。例如
您可以通过存根或模拟 DAO 或存储库接口来测试服务层对象,
无需在运行单元测试时访问持久性数据。
真正的单元测试通常运行得非常快,因为没有运行时基础设施 建立。强调真正的单元测试作为开发方法的一部分可以促进 您的工作效率。你可能不需要测试章节的这一部分来帮助你编写 对基于 IoC 的应用程序进行有效的单元测试。对于某些单元测试场景, 但是,Spring 框架提供了 mock 对象和测试支持类,这些 在本章中进行了介绍。
Mock 对象
Spring 包含许多专门用于 mock 的包:
环境
这org.springframework.mock.env
package 包含Environment
和PropertySource
abstractions 中(参见 Bean 定义配置文件和PropertySource
抽象化).MockEnvironment
和MockPropertySource
对于开发很有用
容器外测试依赖于特定于环境的属性的代码。
JNDI
这org.springframework.mock.jndi
package 包含 JNDI 的部分实现
SPI,可用于为测试套件或独立设置简单的 JNDI 环境
应用。例如,如果 JDBCDataSource
实例绑定到同一个 JNDI
名称,因此您可以重用这两个应用程序代码
以及测试场景中的配置。
模拟 JNDI 支持org.springframework.mock.jndi package 是
从 Spring Framework 5.2 开始正式弃用,取而代之的是 Third 的完整解决方案
Simple-JNDI 等各方。 |
Servlet API
这org.springframework.mock.web
package 包含一组全面的 Servlet API
模拟对象,这些对象对测试 Web 上下文、控制器和过滤器很有用。这些
mock 对象的目标是与 Spring 的 Web MVC 框架一起使用,并且通常更多
比动态 mock 对象(如 EasyMock)更方便使用
或替代 Servlet API 模拟对象(例如 MockObjects)。
从 Spring Framework 6.0 开始,在 6.0 中,模拟对象org.springframework.mock.web 是
基于 Servlet 6.0 API。 |
Spring MVC 测试框架构建在模拟 Servlet API 对象之上,以提供 Spring MVC 的集成测试框架。请参阅 MockMvc。
Spring Web 响应式
这org.springframework.mock.http.server.reactive
package 包含 mock 实现
之ServerHttpRequest
和ServerHttpResponse
用于 WebFlux 应用程序。这org.springframework.mock.web.server
package 包含一个 mockServerWebExchange
那
依赖于这些 mock 请求和响应对象。
双MockServerHttpRequest
和MockServerHttpResponse
从同一摘要中扩展
基类作为特定于服务器的实现,并与它们共享行为。为
例如,模拟请求在创建后是不可变的,但您可以使用mutate()
方法
从ServerHttpRequest
以创建修改后的实例。
为了使 mock 响应正确实现写入协定并返回
写入完成句柄(即Mono<Void>
),则默认情况下,它使用Flux
跟cache().then()
,它缓冲数据并使其可用于测试中的断言。
应用程序可以设置自定义写入函数(例如,测试无限流)。
WebTestClient 基于模拟请求和响应构建,以提供对 在没有 HTTP 服务器的情况下测试 WebFlux 应用程序。客户端还可用于 使用正在运行的服务器进行端到端测试。
单元测试支持类
Spring 包含许多可以帮助进行单元测试的类。他们分为两个 类别:
通用测试实用程序
这org.springframework.test.util
package 包含几个通用实用程序
用于单元和集成测试。
AopTestUtils
是
与 AOP 相关的实用程序方法。您可以使用这些方法获取对
隐藏在一个或多个 Spring 代理后面的底层目标对象。例如,如果你
通过使用 EasyMock 或 Mockito 等库将 bean 配置为动态模拟,
并且 mock 包装在 Spring 代理中,则可能需要直接访问底层
mock 来配置对它的期望并执行验证。对于 Spring 的核心 AOP
实用程序,请参阅AopUtils
和AopProxyUtils
.
ReflectionTestUtils
是一个
基于反射的实用程序方法的集合。您可以在测试中使用这些方法
需要更改常量值的情况下,请将非public
田
调用非public
setter 方法,或调用非 -public
配置或生命周期
callback 方法,例如:
-
纵容
private
或protected
田 访问,而不是public
域实体中属性的 setter 方法。 -
Spring 对注解(例如
@Autowired
,@Inject
和@Resource
), 为private
或protected
字段、setter 方法、 和配置方法。 -
使用注释,例如
@PostConstruct
和@PreDestroy
对于生命周期回调 方法。
TestSocketUtils
是一个简单的
用于查找可用 TCP 端口的实用程序localhost
用于集成测试
场景。
|
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 测试框架。 |