今天復習了一下 造福無數人
Spring2.0 參考手冊中文翻譯--第8章 測試,濃縮即精華的更新了
SpringSide wiki中的--
Spring下的單元測試要點。
???? 注意,文檔還在不斷修改中,建議直接看Wiki 上的最新版本。
1. 需要Spring 依賴注入的測試
???為了測試Spring管理下的Bean,可以自行構造BeanFactory,也可以繼承于AbstractDependencyInjectionSpringContextTests,實現public String[] getConfigLocations()函數, 返回applicationContext文件路徑的數組。
?protectedString[] getConfigLocations() {??????? returnnewString[]{"classpath*:spring/*.xml", "classpath*:spring/test/*.xml"};?}?
??并顯式寫一些需要注入的變量的setter函數。
??? tips1:此基類有一個applicationContext的成員變量,所以除了依靠setter注入外,還可以隨時用applicationContext.getBean() 取出所需的bean。?
??? tips2:注意此基類 默認是autowire by type的,所以如果context文件里有兩個相同類型的Bean就會報錯,可能需要在getConfigLocations()函數里,setAutowireMode(AUTOWIRE_BY_NAME);把它設回by name,或者取消setter函數,自行用applicationContext.getBean()來顯式查找Bean。
2. Dao測試
AbstractTransactionalDataSourceSpringContextTests 繼承于AbstractDependencyInjectionSpringContextTests,除了擁有上類的能力外,還管理了每個測試的事務,會在每個測試后默認回滾所有的操作。
深層解釋:此類的實現其實依賴于Application Context中定義的 PlatformTransactionManager。由于使用了Autowrie by type,可以任意取名。
???????? 另依賴于Application Context中定義的DataSource,同樣可以任意取名。?
tips1:如果需要在測試后提交,需要setRollBack(false); 或者調用setComplete()
tips2:此基類還通過注入的DataSource創建了一個JDBCTemplate 變量,可以跑SQL幫忙核對Hibernate的結果,Spring將確保該查詢在同一個事務內執行。為正常工作你需要告訴你的ORM工具'刷新'它的已改變內容,例如使用Hibernate Session 接口的 flush() 方法。
tips3:除了tips2以外,還有countRowsInTable(String?tableName),deleteFromTables(String[]?names) ,executeSqlScript(String?sqlResourcePath, boolean?continueOnError)三個簡便函數。
3. Controller測試
Controller測試一般要用MockObject 分離Service層,要copy WEB-INF/下的相關文件copy 到classpath,而且Controller不含太多的邏輯,所有測試controller有點吃力不討好,建議直接用Selenium進行集成測試,見(Selenium測試概述)。
4.SpringSide里的測試
因為Spring默認的基類名字較長,SpringSide 在core 的org.springside.core.test 中重新繼承了它們,并提供了默認讀取所有按springside 文件存放規則存放的context 文件的getConfigLocations()函數。
默認讀取所有context文件的getConfigLocations()函數對速度和測試的隔離化都有影響,可以在子類重新實現。不過自己重新一個個寫相關context文件也好煩,而且其實在全lazy-load的情況下,速度也還可以接受。如何取舍要自己平衡了。
對于CRUD的測試,在helloworld示例里的變量名都作了泛化,可以快速copy到另一個測試里。
另外,留意resources/spring/test 下的文件,利用了Spring的PropertyOverrideConfigurer
,新設定測試時的ApplicatonContext 里各個Bean的屬性如指定測試用的DataSource,詳細用法見Spring配置要點。