14.单元测试
依赖注入让你的代码更少地依赖容器,这不同于传统的Java EE开发。组成应用程序的POJO应当能在JUnit或TestNG测试框架中进行测试,对象只需使用new运算符实例化,而无需Spring或任何其他容器。开发者可以使用mock对象(第14.1节)(与其他有用的测试技术协同) 来隔离测试代码。如果遵循Spring的体系结构的建议,那么编写层次清晰和组件化的代码能更便于单元测试。例如,可以通过tubbing、mock DAO或Repository接口对服务层对象进行测试,而无需在运行单元测试时访问持久化数据。
真正的单元测试一般都运行得飞快,因为在运行时无需再作配置。将这种真正的单元测试作为开发方法的一部分能提高开发者的效率。也许你无需阅读“测试”这一章节来帮助你编写基于IoC的单元测试。但是,对于某些单元测试方案,Sping框架提供了以下mock对象和测试支持类。
14.1 mock对象
14.1.1 环境
org.springframework.mock.env
包包含环境和PropertySource
抽象的mock实现(请参看第7.13.1节“bean定义的profiles”和第7.13.2节“PropertySource抽象”)。MockEnvironment
和MockPropertySource
对于开发依赖于环境特定属性的代码的外测试非常有用。
14.1.2 JNDI
org.springframework.mock.jndi
包中包含JNDI SPI的实现,开发者可以使用该实现为测试套件或独立应用程序设置简单的JNDI环境。例如,如果JDBC DataSources在测试代码与Java EE容器中的JNDI名称绑定到相同的名称,那么可以在测试场景中复用应用程序代码和配置,而无需进行修改。
14.1.3 Servlet API
org.springframework.mock.web
包包含一组全面的Servlet API mock对象,这些对象有用于测试Web上下文、控制器和过滤器。这些mock对象是针对Spring Web MVC框架使用的,通常比动态mock对象(例如easymock)或其他Servlet API mock对象(例如MockObjects
)更方便。从Spring 4.0框架开始, org.springframework.mock.web
包中的一组mock基于Servlet 3.0 API。
有关Spring MVC和REST控制器与Spring MVC的WebApplicationContext
配置进行全面集成测试,请参看Spring MVC Test Framework(第15.6节)。
14.2 单元测试支持类
14.2.1 通用的测试工具
org.springframework.test.util
包包含一些用于单元和集成测试的通用工具。
ReflectionTestUtils
是基于反射的工具方法集合。开发者在测试需要更改常量值、设置非公共字段、调用非公共 setter 方法或调用非公共配置或生命周期回调方法的场景中,在涉及测试用例的应用程序代码时,都可以使用这些方法。
- ORM框架(例如JPA和Hibernate)用到private或protected的字段访问,而不是在公共的setter方法设置实体属性。
- Spring对注解的支持(例如@Autowired、@Inject和@Resource等)为声明为private或protected的字段、setter方法和配置方法提供依赖注入。
- 使用注解(例如@PostConstruct和@PreDestroy等)用于生命周期的回调方法。
AopTestUtils
是与AOP相关的工具方法集合。这些方法可用于获取对隐藏在一个或多个Spring代理后面的底层目标对象的引用。例如,如果已经使用EasyMock或Mockito等库将bean配置为动态mock,并且包装在Spring代理中,当需要直接访问它们判断配置是否正确或执行验证时,这些方法就派上用场。有关Spring的核心AOP实用工具,请参看AopUtils
和AopProxyUtils
。
14.2.2 Spring MVC
org.springframework.test.web
包包含ModelAndViewAssert
,开发者可以将它配合JUnit
、TestNG
或其他测试框架一起使用,用于处理Spring MVC ModelAndView对象的单元测试。
提示:如果想将Spring MVC Controller作为POJO进行单元测试,请在Spring的Servlet API Mocks(第14.1.3节)中将
ModelAndViewAssert
配合MockHttpServletRequest
、MockHttpSession
等框架一起使用。有关Spring MVC和REST控制器与Spring MVC的 WebApplicationContext配置进行全面集成测试,请改用Spring MVC测试框架(第15.6节)。