Spring下單元測試的要點

          ?關于Spring的單元測試文檔詳細請看 滿江紅翻譯Spring2.0 參考手冊第8章 測試

          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(String beanName) 取出所需的bean。?

          ??? tips2:注意此基類默認是autowire by type的,所以如果context文件里有兩個相同類型的Bean就會報錯,可能需要在getConfigLocations()函數里,setAutowireMode(AUTOWIRE_BY_NAME);把它設回by name,或者取消setter函數,自行用applicationContext.getBean()來顯式查找Bean。

          2. Dao測試

          ??? AbstractTransactionalDataSourceSpringContextTests 繼承于AbstractDependencyInjectionSpringContextTests,除了擁有上類的能力外,還管理了每個測試的事務,會Open Session In Test,還會在每個測試后默認回滾所有的操作。

          ????深此類的實現其實依賴于Application Context中定義的 PlatformTransactionManager。由于使用了Autowrie by type,PlatformTransactionManager可以任意取名。

          ????另外還依賴于Application Context中定義的DataSource,同樣可以任意取名。?

          ??? tips1:如果需要在測試后提交,需要setRollBack(false); 或者調用setComplete(); 注意如果沒有提交,hibernate這樣奸詐的Framework就不會去實際操作數據庫,降低了測試的效果。

          ??? 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配置要點

          posted on 2010-12-21 17:56 hello 閱讀(158) 評論(0)  編輯  收藏 所屬分類: springside
          主站蜘蛛池模板: 城步| 金堂县| 潍坊市| 无极县| 玛曲县| 蒲江县| 前郭尔| 上饶市| 怀集县| 呈贡县| 水富县| 舟曲县| 江川县| SHOW| 阿合奇县| 禹州市| 东乡县| 佳木斯市| 马山县| 松阳县| 孟村| 五华县| 卢龙县| 且末县| 洱源县| 广水市| 突泉县| 安岳县| 清苑县| 肥东县| 云南省| 台湾省| 广德县| 岳池县| 新绛县| 台安县| 双城市| 文登市| 泸水县| 塔城市| 二连浩特市|