<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    路是爬出來(lái)的

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

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

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

    比如

    robbin     大哥建議:


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



    hyysguyang      大哥建議:篇

    wuhua 寫道

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

    但對(duì)于mock來(lái)說(shuō)是有莫大好處的。

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

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

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



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

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

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

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


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

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

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





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

    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 路是爬出來(lái)的 閱讀(130) 評(píng)論(0)  編輯  收藏


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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲乱码无人区卡1卡2卡3| 亚洲精品动漫在线| 国产成人不卡亚洲精品91| 五月亭亭免费高清在线| 亚洲欧洲在线观看| 免费A级毛片无码视频| 亚洲国产精品自在线一区二区| 在线观看免费黄色网址| 中文亚洲AV片不卡在线观看| 中国黄色免费网站| 国产亚洲老熟女视频| 花蝴蝶免费视频在线观看高清版| 亚洲人成网站在线播放vr| 成人网站免费大全日韩国产 | 99久久99久久精品免费看蜜桃| 亚洲综合小说久久另类区| 国产免费的野战视频| 狠狠色伊人亚洲综合网站色| 免费无码黄网站在线观看| 99亚洲乱人伦aⅴ精品| 久久久久亚洲AV成人网人人网站| 两性色午夜视频免费播放| 亚洲AV日韩AV永久无码绿巨人| 成人午夜免费福利视频| 亚洲国产精品18久久久久久| 中文字幕日韩亚洲| 美丽姑娘免费观看在线观看中文版| 亚洲图片校园春色| 国产成人免费永久播放视频平台| 美女羞羞视频免费网站| 亚洲精品美女久久777777| av免费不卡国产观看| 西西人体大胆免费视频| 久久久久亚洲av无码专区蜜芽| 久久久久久久免费视频| 精品亚洲国产成人av| 亚洲区小说区激情区图片区| 中文字幕人成无码免费视频| 天天综合亚洲色在线精品| 婷婷精品国产亚洲AV麻豆不片 | 免费a级毛片大学生免费观看|