正如 Juergen Hoeller 在他宣布 发布 Spring Framework 3.2 RC1 的文章中提到的那样,Spring 团队在测试支持方面引入了一些令人兴奋的新功能。最重要的是,我们添加了对测试 Web 应用程序的一流支持。[1]
请注意:这是来自我的 Swiftmind 公司博客 的 交叉发布。
在这篇文章中,我们将首先了解 Spring Framework 中一些新的通用测试功能,然后我们将详细介绍对使用 WebApplicationContext
以及请求和会话范围内的 bean 进行测试的支持。最后,我们将介绍对 ApplicationContextInitializers
的支持,并简要讨论使用应用程序上下文层次结构进行测试的路线图。
Rossen Stoyanchev 稍后将发表一篇关于新的Spring MVC 测试框架的详细文章,该框架提供了一流的支持来测试 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…