|
对于最新的稳定版本,请使用 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.jndipackage是
从 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田 调用非publicsetter 方法,或调用非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与您的WebApplicationContextSpring MVC 的配置,请改用 Spring MVC 测试框架。 |