正如 Juergen Hoeller 在其宣布 Spring Framework 3.2 RC1 发布的博文中提到的,Spring 团队在测试支持方面引入了一些令人兴奋的新特性。最重要的是,我们为测试 web 应用添加了第一类支持。[1]
请注意:这是从我的 Swiftmind 公司博客 交叉发布 的文章。
在本文中,我们将首先了解 Spring Framework 中一些通用的新测试特性,然后详细探讨对使用 WebApplicationContext
进行测试以及 request 和 session 作用域 bean 的支持。最后,我们将介绍对 ApplicationContextInitializers
的支持以及对使用应用上下文层次结构进行测试的路线图进行简要讨论。
Rossen Stoyanchev 稍后将跟进发表一篇详细文章,介绍新的 Spring MVC 测试 框架,该框架为测试 Spring MVC 应用提供了第一类支持。因此,请务必保持关注,因为它基于本文后面讨论的基本 web 测试支持。
通用新特性和更新
构建与依赖
spring-test
模块现在基于 JUnit 4.10 和 TestNG 6.5.2 构建并支持它们,并且 spring-test
现在依赖于 junit:junit-dep
Maven artifact,而不是 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…