路是爬出來(lái)的

          [導(dǎo)入]我的第一個(gè)真正意義上的測(cè)試

                 前段日子很無(wú)聊,也是很無(wú)奈的。經(jīng)過(guò)了這段日子的,我想了很多事情,雖然全部想通,但卻努力的去想了。我想這樣就Ok了

          對(duì)嗎?

                 好了。前陣子,老板請(qǐng)喝早茶,順便跟我們這些技術(shù)人員討論了怎么樣可以提高我們內(nèi)功的問(wèn)題。我老板也是技術(shù)出身的。有相當(dāng)多的經(jīng)驗(yàn),當(dāng)然我最初的想法并不是去研究測(cè)試,我直接提出:“我覺(jué)得我們應(yīng)該提高我們對(duì)設(shè)計(jì)模式的理解”。他卻不怎么同意,說(shuō)測(cè)試才是我們現(xiàn)在的當(dāng)務(wù)之急,然后很肯定的說(shuō)。TDD,重構(gòu)都是建立再單元測(cè)試基礎(chǔ)上的。并推翻了我的建議:”有空讓對(duì)設(shè)計(jì)模式有深厚理解的員工給我們上課“。

                 開(kāi)始由于我個(gè)人原因,或許我是個(gè)很情緒話的員工,也許在另外一家公司我可能早就被T。也許老板對(duì)我太好了。^_^

          我當(dāng)時(shí)不怎么響應(yīng),總是做自己喜歡做的事情,后來(lái)自己慢慢覺(jué)得自己的工作態(tài)度不對(duì),所以昨天試著努力糾正自己的錯(cuò)誤,真是在這樣的環(huán)境下,自己寫出了自己第一個(gè)我認(rèn)為真正意義上的測(cè)試,把它記錄下來(lái)。

                 測(cè)試的要求:

                 測(cè)試對(duì)一個(gè)Account的Dao操作以及Service。

          java 代碼


           


          1. //先來(lái)測(cè)試最基本的dao吧  

          2. package org.wuhua.dao;  

          3.   

          4. import java.util.Collection;  

          5.   

          6. public interface IBaseDao {  

          7.     Object save(Object o);  

          8.     void delete(Object o);  

          9.     Object update(Object o);  

          10.     Collection list();  

          11. }  



          根據(jù)我的理解,測(cè)試的對(duì)方要跟mock的對(duì)象分開(kāi),(開(kāi)始我一直認(rèn)為你要mock的對(duì)象就是你要測(cè)試的東西,搞著搞著,我就很迷茫了。)。現(xiàn)在要做的就是看你IBaseDao的實(shí)現(xiàn)是什么了。如果實(shí)現(xiàn)是采用SpringHibernateTemplate的話你就去mock一個(gè)這樣對(duì)象,不過(guò)此對(duì)象并不是接口,所以你要用到easymock的擴(kuò)展包,以對(duì)它的支持。如果你實(shí)現(xiàn)的采用純Hibernate的話。那你就去mock一個(gè)SessionFactory吧。很簡(jiǎn)單吧,難道這就是所謂的解耦嗎?我想是的,這正是解耦。 哈哈



          看下我的實(shí)現(xiàn)吧,采用Spring實(shí)現(xiàn)。

          java 代碼


           


          1. package org.wuhua.dao.impl;  

          2.   

          3. import java.util.Collection;  

          4.   

          5. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;  

          6. import org.wuhua.dao.IBaseDao;  

          7.   

          8. public class BaseDao extends  HibernateDaoSupport  

          9. implements IBaseDao {  

          10.   

          11.     public void delete(Object o) {  

          12.          this.getHibernateTemplate().delete(o);        

          13.     }  

          14.   

          15.     public Collection list() {  

          16.        

          17.         return null;  

          18.     }  

          19.   

          20.     public Object save(Object o) {  

          21.         return this.getHibernateTemplate().save(o);  

          22.             

          23.     }  

          24.   

          25.     public Object update(Object o) {  

          26.         this.getHibernateTemplate().update(o);  

          27.         return o;  

          28.     }  

          29.   

          30. }  



          測(cè)試代碼

          java 代碼


           


          1. package org.wuhua.dao;  

          2.   

          3. import java.io.Serializable;  

          4.   

          5. import junit.framework.TestCase;  

          6.   

          7. import org.easymock.MockControl;  

          8. import org.easymock.classextension.MockClassControl;  

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

          10. import org.wuhua.dao.impl.BaseDao;  

          11.   

          12. public class BaseDaoTest extends TestCase {  

          13.   

          14.     MockControl control;  

          15.   

          16.     private HibernateTemplate ht;  

          17.   

          18.     private BaseDao baseDao;  

          19.   

          20.     protected void setUp() throws Exception {  

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

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

          23.         baseDao = new BaseDao();  

          24.         baseDao.setHibernateTemplate(ht);  

          25.     }  

          26.   

          27.     public void testSave() {  

          28.         Object o = new Object();  

          29.         ht.save(o); 


          30.         //這里我是有疑問(wèn)的。

          31.         //1,為什么HibernateTemplate返回的是Serializable。

          32.         //2,設(shè)置的返回植為什么一定要跟調(diào)用ht.save(o)一致呢?


          33.         control.setReturnValue(new Wuhua());  

          34.         control.replay();  

          35.         baseDao.save(o);  

          36.         control.verify();  

          37.     }  

          38.       

          39.     public void testUpdate() {  

          40.         Object a = new Object();  

          41.         ht.update(a);  

          42.        

          43.         control.replay();  

          44.         try {  

          45.             baseDao.update(a);  

          46.             fail("Not catch exception!");  

          47.         } catch(Exception e) {  

          48.                

          49.         }  

          50.         control.verify();  

          51.     }  

          52.       

          53.     class Wuhua implements Serializable {}  

          54.   

          55. }  



          上面就是我第一次很認(rèn)真的測(cè)試,有很多不明白的地方


          文章來(lái)源: http://wuhua.javaeye.com/blog/37706

          posted on 2006-12-30 08:42 路是爬出來(lái)的 閱讀(95) 評(píng)論(0)  編輯  收藏


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 洪湖市| 石嘴山市| 额济纳旗| 泸水县| 罗城| 临桂县| 苗栗市| 临清市| 日土县| 迁西县| 南康市| 龙南县| 金华市| 桐乡市| 安丘市| 平度市| 张北县| 淳安县| 广宗县| 河津市| 社会| 台江县| 历史| 衡阳市| 凤山县| 嘉禾县| 辽源市| 天柱县| 高碑店市| 彰化县| 从化市| 台中市| 新化县| 乌拉特前旗| 新河县| 柘荣县| 大渡口区| 华池县| 临汾市| 琼中| 曲周县|