正如 Juergen Hoeller 在他宣布 Spring Framework 3.2 RC1 发布 的文章中提到的,Spring 团队在测试支持方面引入了一些令人兴奋的新特性。最重要的是,我们为测试 web 应用程序添加了一流的支持。[1]
请注意:这是一篇从我的公司博客 www.swiftmind.com 交叉发布的文章。
在本文中,我们将首先介绍 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 创建动态 mock。例如,在 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…