On this page
14. 单元测试
与传统的 Java EE 开发相比,依赖注入应该使您的代码对容器的依赖程度降低。组成您的应用程序的 POJO 应该可以在 JUnit 或 TestNG 测试中进行测试,并且可以使用new
运算符(没有 Spring 或任何其他容器)简单地实例化对象。您可以使用mock objects(结合其他有价值的测试技术)来单独测试代码。如果您遵循 Spring 的体系结构建议,那么代码库的最终分层和组件化将有助于简化单元测试。例如,您可以通过存根或模拟 DAO 或存储库接口来测试服务层对象,而无需在运行单元测试时访问持久性数据。
true 的单元测试通常运行非常快,因为没有可设置的运行时基础架构。在开发方法论中强调 true 的单元测试将提高您的生产率。您可能不需要测试章节的这一部分来帮助您为基于 IoC 的应用程序编写有效的单元测试。但是,对于某些单元测试方案,Spring 框架提供了以下模拟对象和测试支持类。
14.1 模拟对象
14.1.1 Environment
org.springframework.mock.env
软件包包含Environment
和PropertySource
抽象的模拟实现(请参见第 7.13.1 节“ Bean 定义配置文件”和第 7.13.2 节“ PropertySource 抽象”)。 MockEnvironment
和MockPropertySource
对于为依赖于特定于环境的属性的代码开发容器外测试非常有用。
14.1.2 JNDI
org.springframework.mock.jndi
软件包包含 JNDI SPI 的实现,可用于为测试套件或独立应用程序设置简单的 JNDI 环境。例如,如果 JDBC DataSource
绑定到测试代码中与 Java EE 容器中相同的 JNDI 名称,则可以在测试场景中重用应用程序代码和配置,而无需进行修改。
14.1.3 Servlet API
org.springframework.mock.web
软件包包含一组全面的 Servlet API 模拟对象,可用于测试 Web 上下文,控制器和过滤器。这些模拟对象针对 Spring 的 Web MVC 框架使用,并且通常比诸如EasyMock之类的动态模拟对象或诸如MockObjects之类的替代 Servlet API 模拟对象更易于使用。从 Spring Framework 4.0 开始,org.springframework.mock.web
包中的模拟集基于 Servlet 3.0 API。
有关 Spring MVC 和 REST Controller
以及 Spring MVC 的WebApplicationContext
配置的全面集成测试,请参阅Spring MVC 测试框架。
14.1.4 Portlet API
org.springframework.mock.web.portlet
软件包包含一组 Portlet API 模拟对象,旨在用于 Spring 的 Portlet MVC 框架。
14.2 单元测试支持类
14.2.1 通用测试 Util
org.springframework.test.util
软件包包含几个通用 Util,可用于单元和集成测试。
ReflectionTestUtils
是基于反射的 Util 方法的集合。开发人员在测试场景中使用这些方法,在测试场景中,他们需要更改常量的值,设置非public
字段,调用非public
setter 方法或在测试时调用非public
* configuration 或 lifecycle *回调方法涉及以下用例的应用程序代码。
诸如 JPA 和 Hibernate 之类的 ORM 框架纵容
private
或protected
字段访问,而不是针对域实体中的属性的public
setter 方法。Spring 对
@Autowired
,@Inject
和@Resource
之类的 Comments 的支持,该 Comments 为private
或protected
字段,setter 方法和配置方法提供依赖项注入。将
@PostConstruct
和@PreDestroy
之类的 Comments 用于生命周期回调方法。
AopTestUtils
是与 AOP 相关的 Util 方法的集合。这些方法可用于获取对隐藏在一个或多个 Spring 代理后面的基础目标对象的引用。例如,如果您已使用 EasyMock 或 Mockito 之类的库将 bean 配置为动态模拟,并且该模拟包装在 Spring 代理中,则可能需要直接访问基础模拟,以便为其配置期望并执行验证。有关 Spring 的核心 AOPUtil,请参见AopUtils
和AopProxyUtils
。
14.2.2 Spring MVC
org.springframework.test.web
包包含ModelAndViewAssert
,您可以将ModelAndViewAssert
与 JUnit,TestNG 或任何其他测试框架结合使用,以进行处理 Spring MVC ModelAndView
对象的单元测试。
Tip
要对作为 POJO 的 Spring MVC Controller
进行单元测试,请结合使用ModelAndViewAssert
和 Spring 的Servlet API 模拟中的MockHttpServletRequest
,MockHttpSession
等。为了对 Spring MVC 和 REST Controller
以及 Spring MVC 的WebApplicationContext
配置进行全面的集成测试,请改用Spring MVC 测试框架。