正如Juergen Hoeller在其宣布Spring Framework 3.2 RC1发布的博文中提到的那样,Spring团队在测试支持方面引入了一些令人兴奋的新功能。最重要的是,我们为测试Web应用程序添加了一流的支持。[1]
请注意:这是一篇来自我的Swiftmind公司博客的交叉发布。
在这篇文章中,我们将首先介绍Spring Framework中一些通用的新测试功能,然后详细讨论对使用WebApplicationContext以及请求(request)和会话(session)作用域bean进行测试的支持。最后,我们将介绍对ApplicationContextInitializers的支持,并简要讨论使用应用程序上下文层次结构进行测试的路线图。
Rossen Stoyanchev稍后将发表一篇详细介绍新的Spring MVC Test框架的博文,该框架为测试Spring MVC应用程序提供了一流的支持。因此,请务必关注,因为它基于本文后面讨论的基本Web测试支持。
通用新功能和更新
构建和依赖
spring-test模块现在基于并支持JUnit 4.10和TestNG 6.5.2构建,并且spring-test现在依赖于junit:junit-dep Maven工件而不是junit:junit,这意味着您可以完全控制对Hamcrest库(例如,hamcrest-core、hamcrest-all等)的依赖。
泛型工厂方法
泛型工厂方法是使用Java泛型实现工厂方法设计模式的方法。以下是一些泛型工厂方法的示例签名
public static <T> T mock(Class<T> clazz) { ... }
public static <T> T proxy(T obj) { ... }
在Spring配置中使用泛型工厂方法并非测试专用,但EasyMock.createMock(MyService.class)或Mockito.mock(MyService.class)等泛型工厂方法通常用于在测试应用程序上下文中为Spring bean创建动态模拟。例如,在Spring Framework 3.2之前,以下配置可能无法将OrderRepository自动装配到OrderService中。原因在于,根据应用程序上下文中bean的初始化顺序,Spring可能会将orderRepository bean的类型推断为java.lang.Object而不是com.example.repository.OrderRepository。
<beans>
<!-- OrderService is autowired with OrderRepository -->
<context:component-scan base-package="com.example.service"/>
<bean id="orderRepository" class="org.easymock.EasyMock…