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软件包包含EnvironmentPropertySource抽象的模拟实现(请参见第 7.13.1 节“ Bean 定义配置文件”第 7.13.2 节“ PropertySource 抽象”)。 MockEnvironmentMockPropertySource对于为依赖于特定于环境的属性的代码开发容器外测试非常有用。

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 框架纵容privateprotected字段访问,而不是针对域实体中的属性的public setter 方法。

  • Spring 对@Autowired@Inject@Resource之类的 Comments 的支持,该 Comments 为privateprotected字段,setter 方法和配置方法提供依赖项注入。

  • @PostConstruct@PreDestroy之类的 Comments 用于生命周期回调方法。

AopTestUtils是与 AOP 相关的 Util 方法的集合。这些方法可用于获取对隐藏在一个或多个 Spring 代理后面的基础目标对象的引用。例如,如果您已使用 EasyMock 或 Mockito 之类的库将 bean 配置为动态模拟,并且该模拟包装在 Spring 代理中,则可能需要直接访问基础模拟,以便为其配置期望并执行验证。有关 Spring 的核心 AOPUtil,请参见AopUtilsAopProxyUtils

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 模拟中的MockHttpServletRequestMockHttpSession等。为了对 Spring MVC 和 REST Controller以及 Spring MVC 的WebApplicationContext配置进行全面的集成测试,请改用Spring MVC 测试框架