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

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

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

    路是爬出來的

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

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

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

    比如

    robbin     大哥建議:


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



    hyysguyang      大哥建議:篇

    wuhua 寫道

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

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

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

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

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



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

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

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

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


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

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

    其實說白了,測試這東西只是為了項目更好,更快的完成。至于是否要求純單元,或者是集成單元測試,則看各位的需要,如果覺得集成單元測試對項目有幫助,那就用吧,現(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. }   





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


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


    網(wǎng)站導航:
     
    主站蜘蛛池模板: 伊在人亚洲香蕉精品区麻豆| 91视频免费观看高清观看完整| 亚洲w码欧洲s码免费| 99久久亚洲综合精品成人网| 亚洲国产精品无码久久久不卡 | 999久久久免费精品播放| 中国好声音第二季免费播放| 好湿好大好紧好爽免费视频 | 亚洲va成无码人在线观看| 亚洲国产韩国一区二区| 亚洲另类精品xxxx人妖| 国产精品久久亚洲不卡动漫| 亚洲www77777| 久久亚洲AV成人无码国产电影| 含羞草国产亚洲精品岁国产精品 | 亚洲麻豆精品果冻传媒| 亚洲狠狠狠一区二区三区| 亚洲一区二区三区在线| 亚洲中文字幕乱码一区| 国产精品亚洲一区二区在线观看| 国内成人精品亚洲日本语音 | 亚洲国产精品99久久久久久| 黄色网址免费在线| 亚洲国产免费综合| 全免费a级毛片免费看| 五月亭亭免费高清在线| 妞干网手机免费视频| 国产一级大片免费看| 亚洲中文字幕无码久久综合网| 亚洲AV无码国产精品麻豆天美| 亚洲第一成年人网站| 亚洲精华国产精华精华液| 一级毛片免费视频网站| 久久99毛片免费观看不卡| 99在线精品免费视频九九视| 好爽好紧好大的免费视频国产| 在线观看亚洲精品福利片| 精品亚洲A∨无码一区二区三区| 亚洲情A成黄在线观看动漫软件| 日韩成人毛片高清视频免费看| 国产99视频精品免费专区|