测试
本章涵盖了Spring对集成测试的支持以及单元测试的最佳实践。Spring团队提倡测试驱动开发(TDD)。Spring团队发现,正确使用控制反转(IoC)确实能够使单元测试和集成测试变得更加容易(因为类中存在setter方法和适当的构造函数,使得在测试中将它们组合在一起变得更加简单,而无需设置服务定位器注册表等类似结构)。
部分总结
📄️ Spring 测试简介
测试是企业软件开发不可或缺的一部分。本章重点介绍IoC原则对单元测试的附加价值,以及Spring框架对集成测试的支持所带来的好处。(对企业测试的全面探讨超出了本参考手册的范围。)
📄️ 单元测试
依赖注入应该使你的代码比使用传统的J2EE/Java EE开发方式时更少地依赖于容器。构成你应用程序的POJO(Plain Old Java Object)应该能够在JUnit或TestNG测试中被测试,这些对象的实例化是通过new操作符完成的,而不需要Spring或其他任何容器。你可以使用模拟对象(结合其他有价值的测试技术)来独立地测试你的代码。如果你遵循Spring的架构建议,那么你所获得的清晰分层和组件化将有助于更轻松地进行单元测试。例如,你可以通过对DAO(Data Access Object)或repository(数据存储接口)进行存根(stub)或模拟(mocking)来测试服务层对象,而在运行单元测试时无需访问持久化数据。
📄️ 集成测试
能够在不需要将代码部署到应用服务器或连接到其他企业基础设施的情况下进行一些集成测试是非常重要的。这样做可以让你测试诸如以下内容:
📄️ JDBC测试支持
org.springframework.test.jdbc 包包含了 JdbcTestUtils,这是一个包含与 JDBC 相关的实用函数的集合,旨在简化标准的数据库测试场景。具体来说,JdbcTestUtils 提供了以下静态实用方法。
🗃️ Spring 测试上下文框架
14 个项目
📄️ WebTestClient
WebTestClient是一个专为测试服务器应用程序而设计的HTTP客户端。它封装了Spring的WebClient,并利用其来执行请求,但提供了用于验证响应的测试接口。WebTestClient可以用来执行端到端的HTTP测试。此外,通过使用模拟的请求和响应对象,它还可以在没有运行中的服务器的情况下测试Spring MVC和Spring WebFlux应用程序。
📄️ RestTestClient
RestTestClient是一个专为测试服务器应用程序而设计的HTTP客户端。它封装了Spring的RestClient,并利用其来发送请求,但提供了用于验证响应的测试接口。RestTestClient可用于执行端到端的HTTP测试。此外,通过MockMvc,它还可以在不需要运行服务器的情况下测试Spring MVC应用程序。
🗃️ MockMvc
7 个项目
📄️ 测试客户端应用程序
要测试使用RestClient或RestTemplate的代码,可以使用模拟Web服务器,例如OkHttp MockWebServer或WireMock。模拟Web服务器像普通服务器一样接收HTTP请求,这意味着你可以使用与生产环境中配置相同的HTTP客户端来进行测试,这一点很重要,因为不同客户端处理网络I/O的方式往往存在细微的差异。模拟Web服务器的另一个优点是,能够结合生产环境中使用的客户端来模拟特定的网络问题和传输层条件。
🗃️ 附录
2 个项目