路是爬出來的

          導航

          <2006年12月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          統計

          常用鏈接

          留言簿(1)

          隨筆檔案

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          單元測試之實踐二,關于DAO的測試

                 前陣子發表過 我的第一個真正意義上的測試

          里面對于測試Service大家是沒有意義的,對于測試DAO層則表現各有各的看法。

          比如

          robbin     大哥建議:


          測試DAO不如連數據庫一起測試吧。因為DAO測試的目的不是DAO接口實現對不對,而是測試是否如你預期的發送了SQL,如你預期的返回了結果集。這個時候你Mock之后,測試就沒有意義了。



          hyysguyang      大哥建議:篇

          wuhua 寫道

          分層的原因很多。這里我的看法片面就不說了

          但對于mock來說是有莫大好處的。

          比如service測試的時候完全可以做到隔離數據庫,

          我現在的意思是,

          居然Service可以隔離Dao層,也就是說Dao層也是可以做到隔離相關的數據實現的。也是可以mock一個對象。而并非用實際的連接去代 替。如果我們的邏輯沒出錯的話,測試就算通過了,至于數據層的檢測,那就不關我們的事情了,比如Hibernate由Hibernate去test, Spring由Spring去Test,Oracle由它自己去做。干自己的事情,別趟其他渾水。這樣不是瀟灑很多嗎



          但是數據庫的測試畢竟比較特殊,記住測試的目的是確保你的代碼質量,如果你確定你的這樣測就沒問題了,那無話可說,否則就盡量多的測試。

          事實上,最原始的單元測試(plain testcase)就是用來測方法,測業務邏輯的,如果有邏輯就測,沒邏輯就不用測了,同樣的道理,相信你不會去測一個bean的get/set方法吧。

          記住你測試的目的和動機,如果你認為測試dao層是為了測你的邏輯(你確定你的dao的實現代碼是否真的存在邏輯),那你就mock吧,但是,我 們更相信,我們測DAO層,更應該是測訪問數據庫的情況,你如連接,sql是否正確,sequence是否正確等,而這些你必須要真正的連接數據庫,也因 此,我們一般都是直接訪問數據庫來測試的,當然,如果可能你可以采用內存庫。

          事實上,我們對dao的測試,一般都進行所謂的的集成單元測試。我認為,你應該確定好你的測試策略,然后在去采用相應的測試方法。我在目前的開發中就是采用這樣的方式測的。


          上面兩個大哥都建議測試DAO的時候還是連接數據庫為好。

          但個人認為上面兩個大哥的單元測試以非純正的單元測試了,而是集成單元測試。

          其實說白了,測試這東西只是為了項目更好,更快的完成。至于是否要求純單元,或者是集成單元測試,則看各位的需要,如果覺得集成單元測試對項目有幫助,那就用吧,現在發現對這個已經沒有明顯的界限了。





          不理會它了,現在回歸到我們用戶注冊的例子。

          java 代碼


           


          1. 1public interface IAccountDao extends IBaseDao {    

          2. 2.     public Account findAccountById(String id);    

          3. 3.     public Account findAccounByName(String name);    

          4. 4. }   





          實際實現代碼

          java 代碼


           


          1. package org.wuhua.dao.impl;  

          2.   

          3. import java.util.List;  

          4.   

          5. import org.wuhua.dao.IAccountDao;  

          6. import org.wuhua.model.Account;  

          7.   

          8. public class AccountDao extends BaseDao implements IAccountDao {  

          9.   public Account findAccountById(String id) {  

          10.         return (Account) this.getHibernateTemplate().get(Account.class, id) ;  

          11.     }  

          12.   

          13.     public Account findAccounByName(String name) {  

          14.         List l = this.getHibernateTemplate().find("from Account as a where a.name=?", name);  

          15.         if(l != null && l.size() >=1)  

          16.             return (Account) l.get(0);  

          17.         else   

          18.             return null;  

          19.     }  

          20. }  





          java 代碼


           


          1. package org.wuhua.dao;  

          2.   

          3. import java.util.ArrayList;  

          4. import java.util.List;  

          5.   

          6. import junit.framework.Assert;  

          7. import junit.framework.TestCase;  

          8.   

          9. import org.easymock.MockControl;  

          10. import org.easymock.classextension.MockClassControl;  

          11. import org.springframework.orm.hibernate3.HibernateTemplate;  

          12. import org.wuhua.dao.impl.AccountDao;  

          13. import org.wuhua.model.Account;  

          14.   

          15.    

          16.   

          17. public class AccountDaoTest extends TestCase {  

          18.       

          19.     private AccountDao accountDao;  

          20.     private org.springframework.orm.hibernate3.HibernateTemplate ht;  

          21.     private MockControl control;  

          22.   

          23.     protected void setUp() throws Exception {  

          24.         control = MockClassControl.createControl(HibernateTemplate.class);  

          25.         ht = (HibernateTemplate) control.getMock();  

          26.         accountDao = new AccountDao();  

          27.         accountDao.setHibernateTemplate(ht);  

          28.     }  

          29.   

          30.     protected void tearDown() throws Exception {  

          31.            

          32.     }  

          33.       

          34.     public void testFindAccountById(){  

          35.         Account a = new Account("wuhua");  

          36.         a.setId("10");     

          37.           

          38.         ht.get(Account.class, a.getId());  

          39.           

          40.         control.setReturnValue(a);  

          41.           

          42.         control.replay();  

          43.           

          44.         Account result =   accountDao.findAccountById(a.getId());  

          45.           

          46.         assertNotNull(result);  

          47.   

          48.         Assert.assertEquals(a.getId(),result.getId());  

          49.         Assert.assertEquals(a, result);  

          50.           

          51.         control.verify();  

          52.           

          53.     }  

          54.       

          55.     public void testFindAccountByName(){  

          56.         Account a = new Account("wuhua");      

          57.            

          58.         ht.find("from Account as a where a.name=?", a.getName());  

          59.         List l = new ArrayList();  

          60.         l.add(a);  

          61.         control.setReturnValue(l);  

          62.           

          63.         control.replay();  

          64.           

          65.         Account result =  accountDao.findAccounByName(a.getName());  

          66.   

          67.         Assert.assertEquals(a.getId(),result.getId());  

          68.         Assert.assertEquals(a, result);  

          69.           

          70.         control.verify();  

          71.           

          72.     }  

          73. }  


          posted on 2006-12-30 09:06 路是爬出來的 閱讀(131) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 黎平县| 淮南市| 莲花县| 太白县| 湘潭县| 丰顺县| 双城市| 保山市| 贡嘎县| 德清县| 宁津县| 井研县| 敦化市| 丰都县| 兰考县| 天全县| 古丈县| 扎鲁特旗| 连城县| 平潭县| 锡林郭勒盟| 桃江县| 水城县| 常山县| 武定县| 邳州市| 措勤县| 宁陵县| 溧水县| 建始县| 望江县| 美姑县| 平利县| 五家渠市| 田阳县| 马关县| 双柏县| 舟曲县| 洛浦县| 东乌| 堆龙德庆县|