風人園

          弱水三千,只取一瓢,便能解渴;佛法無邊,奉行一法,便能得益。
          隨筆 - 99, 文章 - 181, 評論 - 56, 引用 - 0
          數據加載中……

          Spring2.0--單元測試要點

          今天復習了一下 造福無數人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配置要點

          posted on 2007-02-08 17:11 風人園 閱讀(697) 評論(0)  編輯  收藏 所屬分類: Spring

          主站蜘蛛池模板: 玛纳斯县| 突泉县| 兴化市| 青河县| 长宁县| 康马县| 耒阳市| 阜康市| 新晃| 肥东县| 南乐县| 南和县| 遂昌县| 法库县| 青铜峡市| 乌审旗| 佛学| 正定县| 喜德县| 名山县| 余江县| 乾安县| 亚东县| 洛阳市| 阳城县| 确山县| 镶黄旗| 屏山县| 东辽县| 电白县| 和田市| 承德县| 湘潭县| 石渠县| 榆中县| 中卫市| 广西| 青海省| 纳雍县| 岑溪市| 荣昌县|