正如 Juergen Hoeller 在他宣布 发布 Spring Framework 3.2 RC1 的文章中提到的那样,Spring 团队在测试支持方面引入了一些令人兴奋的新功能。最重要的是,我们添加了对测试 Web 应用程序的一流支持。[1]
请注意:这是我 Swiftmind 公司博客的 交叉发布。
在这篇文章中,我们将首先了解 Spring Framework 中一些新的通用测试功能,然后我们将详细介绍如何使用 WebApplicationContext
以及作用域为 请求 和 会话 的 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…