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字段访问,而不是针对域实体中的属性的publicsetter 方法。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 测试框架。