路是爬出來的

          單元測試之實(shí)踐二,關(guān)于DAO的測試

                 前陣子發(fā)表過 我的第一個真正意義上的測試 。

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

          比如

          robbin     大哥建議:


          測試DAO不如連數(shù)據(jù)庫一起測試吧。因為DAO測試的目的不是DAO接口實(shí)現(xiàn)對不對,而是測試是否如你預(yù)期的發(fā)送了SQL,如你預(yù)期的返回了結(jié)果集。這個時候你Mock之后,測試就沒有意義了。



          hyysguyang      大哥建議:篇

          wuhua 寫道

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

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

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

          我現(xiàn)在的意思是,

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



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

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

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

          事實(shí)上,我們對dao的測試,一般都進(jìn)行所謂的的集成單元測試。我認(rèn)為,你應(yīng)該確定好你的測試策略,然后在去采用相應(yīng)的測試方法。我在目前的開發(fā)中就是采用這樣的方式測的。


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

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

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





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

          java 代碼


           


          1. 1public interface IAccountDao extends IBaseDao {    

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

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

          4. 4. }   





          實(shí)際實(shí)現(xiàn)代碼

          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 路是爬出來的 閱讀(132) 評論(0)  編輯  收藏


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 综艺| 上虞市| 湖口县| 确山县| 来凤县| 城市| 龙川县| 九台市| 吉水县| 石家庄市| 兰溪市| 诏安县| 铁力市| 宝清县| 连江县| 东台市| 扶余县| 新宾| 新化县| 邵武市| 镇坪县| 盐亭县| 齐齐哈尔市| 洛宁县| 彩票| 黄陵县| 泰顺县| 日喀则市| 滕州市| 镇沅| 福州市| 年辖:市辖区| 醴陵市| 陇川县| 莎车县| 新巴尔虎左旗| 尼玛县| 江城| 喀喇沁旗| 武义县| 木兰县|