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