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