正如 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…