隨筆 - 3, 文章 - 1, 評(píng)論 - 2, 引用 - 0
          數(shù)據(jù)加載中……

          2006年12月27日

          EasyMock簡單用

                  在實(shí)際編寫unit test的過程中,很多情況下我們會(huì)需要使用其他的組件(如和數(shù)據(jù)庫相關(guān)的測試)。當(dāng)我們是使用第三方提供的組件時(shí),這并不是太大的問題,因?yàn)槲覀兛梢约僭O(shè)他們是無錯(cuò)的。但是一旦這些組件是我們自己的組件時(shí),問題就暴露出來了。

          “單元測試出錯(cuò)了,但到底是誰的錯(cuò)。我的?他的?”,這種情況顯然違反了測試的獨(dú)立性原則。出現(xiàn)這種情況使得這個(gè)測試無法確切的指出是那個(gè)單元出現(xiàn)了問題,照成了排錯(cuò)的困難,而且也浪費(fèi)了時(shí)間。同時(shí),過分的將單元的測試代碼依賴于其他單元,也照成了其他一些很現(xiàn)實(shí)的問題:

          在所依賴的單元完成之前,無法順利的編寫單元測試。

          產(chǎn)生環(huán)境的依賴性,如運(yùn)行一個(gè)HttpServletRequest處理器的測試代碼必須啟動(dòng)一個(gè)servlet容器。

          所有這些問題,都可以使用Mock Object來解決。使用它的前提是,所依賴單元的接口必須定義清楚。而EasyMock正是為了這一目的而產(chǎn)生的。

          使用目的

                 通過模擬unit test所需要的組件,已達(dá)到隔離各個(gè)unit test的目的。目前的版本1.1,它所需要的環(huán)境是jdk1.3.1以上和junit3.8.1以上。

          可以從http://sourceforge.net/projects/easymock/處下載。

          用法

          1.       EasyMock采用“記錄-----回放”的工作模式,基本使用步驟:

          -          創(chuàng)建Mock對象的控制對象Control。

          -          從控制對象中獲取所需要的Mock對象。

          -          記錄測試方法中所使用到的方法和返回值。

          -          設(shè)置Control對象到“回放”模式。

          -          進(jìn)行測試。

          -          在測試完畢后,確認(rèn)Mock對象已經(jīng)執(zhí)行了剛才定義的所有操作。

          2.       使用舉例:假設(shè)需要測試的對象是RequestUtil,所需要測試的方法為getBoolean。此時(shí)我們需要模擬一個(gè)HttpServletRequest對象。

          public void testGetStringHttpServletRequestString() {

          public void testGetBoolean() {

             //創(chuàng)建Mock對象的控制器

             MockControl  control= MockControl.createControl( HttpServletRequest.class);

             //獲取Mock對象

             HttpServletRequest  mock= (HttpServletRequest)control.getMock();

             //設(shè)置getBoolean中要使用的方法和返回值

          control.expectAndReturn( mock.getParameter( "test"), null);
                      
                  
          //設(shè)置控制器為replay模式

                  control.replay();

                  //執(zhí)行測試

                  assertNull( RequestUtil.getString( mock, "test"));

                  //確認(rèn)

                  control.verify();

              }

          }

              通過EasyMock,執(zhí)行這段測試代碼完全不需要啟動(dòng)一個(gè)servlet容器,在命令行的方式下即可完成,非常的方便。

          3.       記錄需要使用的Mock的行為。在使用一個(gè)Mock對象之前,需要設(shè)置我們要用到的方法,以及每個(gè)方法的返回值。對于那些沒有設(shè)置的方法,一旦調(diào)用(控制器處于replay模式),EasyMock就會(huì)拋出異常。記錄一個(gè)方法,通??梢苑殖?/span>2:首先,如同使用正常對象調(diào)用這個(gè)方法;然后,使用控制器的setReturnValue函數(shù)設(shè)置即可。在1.1中,提供了expectAndReturn函數(shù),使得2步可以合而為一。主要的函數(shù)大致如下:

          -          expectAndReturn,設(shè)置期望調(diào)用的函數(shù),以及返回值

          -          expectAndThrow,設(shè)置期望調(diào)用的函數(shù),同時(shí)期望該次調(diào)用拋出異常

          -          setReturnValue,設(shè)置上一次調(diào)用的返回值(如上次調(diào)用時(shí),request.getparameter( “test”),此處設(shè)置request.getparameter( “test”)的返回值)

          -          setThrowable,設(shè)置上次調(diào)用拋出的異常

          EasyMock中還可以設(shè)置調(diào)用所執(zhí)行的次數(shù),具體細(xì)節(jié)請參見對應(yīng)的javaDoc。

          4.       使用舉例:

          MockControl  control= MockControl.createControl( HttpServletRequest.class);

          HttpServletRequest  mock= (HttpServletRequest)control.getMock();

          mock.getParameter( "test");

          //設(shè)置第一次調(diào)用request.getParameter的返回值

          control.setReturnValue( null, 1);

          //設(shè)置第二次調(diào)用request.getParameter的返回值

          control.setReturnValue("this is a test", 1);

          control.replay();

          assertEquals( RequestUtil.getString( mock, "test", "haha"), "haha");

          assertEquals( RequestUtil.getString( mock, "test"), "this is a test");

          control.verify();

          5.       Mock對象使用結(jié)束后,務(wù)必調(diào)用控制器的verify函數(shù),以確認(rèn)Mock對象的方法得到了調(diào)用。

          6.       調(diào)用方法的次序,使用Strict。有時(shí),測試代碼依賴于被依賴組件的方法的次序。如在測試與數(shù)據(jù)庫相關(guān)代碼時(shí),測試代碼很有可能是這樣的次序:先打開數(shù)據(jù)庫鏈接,執(zhí)行操作,關(guān)閉鏈接。為了更好的測試這樣的代碼,可以使用MockControl.createStrictControl()來創(chuàng)建一個(gè)嚴(yán)格的Mock對象控制器,在其中,他會(huì)規(guī)定Mock出來的對象的調(diào)用次序。

          以上是EasyMock的主要使用,至于其他的用法,請參見具體的文檔。

          PS:當(dāng)自己動(dòng)手實(shí)現(xiàn)Mock對象時(shí),不要在Mock對象中實(shí)現(xiàn)業(yè)務(wù)邏輯。

          posted @ 2007-10-05 15:33 patsYang 閱讀(289) | 評(píng)論 (0)編輯 收藏

          難道我們真的只是做我們應(yīng)該做的嗎?

          我不知道自己是怎么回事!也不知道到底是因?yàn)槭裁矗∥业纳钣肋h(yuǎn)都是悲喜交加的!也許一天中就能發(fā)生許多的變化!而且也習(xí)慣了今天站在很高的地方!明天就摔得很慘!但是自己又是總喜歡說喜歡追求刺激的生活!但我最近我才發(fā)現(xiàn),原來我所追求的生活是天天有追求有收獲的!我可能害怕承擔(dān)責(zé)任,但是我又想去承擔(dān)很多的責(zé)任!因?yàn)樵谖铱磥恚灰穷I(lǐng)導(dǎo)交給我任務(wù),就代表對我的信任!那么我會(huì)盡最大努力去做好!不知道是怎么回事!雖說剛剛上班沒有多長時(shí)間!我也不知道這樣算好算壞!我會(huì)把現(xiàn)在做的項(xiàng)目當(dāng)成自己的事情!哪個(gè)地方出了問題!我可以很少睡覺!只是想不辜負(fù)任何人!但是我又知道在工作中結(jié)果比過程重要的多!所以我很失望,也很難受!很多的事情沒有成功,我不知道是我錯(cuò)還是領(lǐng)導(dǎo)有問題!我并不是想追究責(zé)任,我只是不想當(dāng)一件事情失敗的時(shí)候,我所有的努力都不會(huì)再被看到!我可以以身體為代價(jià)來完成我的努力!只是為了想把事情做好!真的只是想能為領(lǐng)導(dǎo)分擔(dān)些事情!但是當(dāng)我真的抗不住的時(shí)候!我又能怎么辦呢!也許工作中本不應(yīng)該去努力替他人分擔(dān)什么的!總之今天領(lǐng)導(dǎo)說了一句讓我很是失望的話!也許可以說是有些傷心吧!所以我想我只做我能做的!做我應(yīng)該做的!

          posted @ 2007-01-17 20:57 patsYang 閱讀(231) | 評(píng)論 (2)編輯 收藏

          my heart

          ???剛剛出來工作!連自己都不知道為什么能進(jìn)入這家公司!不過我的確很是高興!我真的是一直都在努力!現(xiàn)在正在出差!每天都要工作到11點(diǎn)多!也有很多時(shí)候是要通宵!不過我很開心!因?yàn)槲椰F(xiàn)在過得很是充實(shí)!而且我也想來證明自己!我想用我的行動(dòng)告訴公司的所有人!雖然我現(xiàn)在不是很強(qiáng)!但是我很努力!我會(huì)去努力的學(xué)習(xí)!我一定會(huì)在公司中成為重要的角色!
          ???現(xiàn)在工作這邊只有我一個(gè)人!很多事情都在我的身上!這幾天幾乎就沒有怎么睡覺!我唯一想做的就是能夠把事情做好!可是真的是遇到了很多困難!每天寫工作日志的時(shí)候都不知道應(yīng)該如何去寫!因?yàn)檫@幾天工作日志幾乎就是一樣的!不是怕領(lǐng)導(dǎo)會(huì)說什么!只不過真的覺得自己很沒用??!(只是發(fā)泄!覺得沒有泄氣!哈哈!)真的覺得自己好讓人失望??!呵呵!現(xiàn)在又要寫工作日報(bào)了!調(diào)節(jié)一下自己!完了繼續(xù)開工了!我會(huì)告訴自己!盡最大的努力!做好自己的事情!雖然工作講求效率!雖然我有很多的不會(huì)!但是至少我是盡力的!我做到無愧于心!我想就夠了!
          ???我會(huì)繼續(xù)努力!因?yàn)椤〈笳煞颍M行天下!

          posted @ 2006-12-27 22:28 patsYang 閱讀(180) | 評(píng)論 (0)編輯 收藏

          主站蜘蛛池模板: 河西区| 韶山市| 大悟县| 五河县| 丹江口市| 桐城市| 从江县| 哈尔滨市| 桑日县| 太湖县| 金山区| 永修县| 成都市| 桂平市| 安新县| 巴林左旗| 湖口县| 东台市| 陈巴尔虎旗| 丰顺县| 林州市| 巢湖市| 子洲县| 宣恩县| 长岛县| 阜新| 仁化县| 新余市| 开远市| 武陟县| 张掖市| 宿迁市| 永平县| 唐海县| 会理县| 清水河县| 宣恩县| 高雄县| 尚义县| 秀山| 健康|