隨筆 - 3, 文章 - 1, 評論 - 2, 引用 - 0
          數據加載中……

          2007年10月5日

          EasyMock簡單用

                  在實際編寫unit test的過程中,很多情況下我們會需要使用其他的組件(如和數據庫相關的測試)。當我們是使用第三方提供的組件時,這并不是太大的問題,因為我們可以假設他們是無錯的。但是一旦這些組件是我們自己的組件時,問題就暴露出來了。

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

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

          產生環境的依賴性,如運行一個HttpServletRequest處理器的測試代碼必須啟動一個servlet容器。

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

          使用目的

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

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

          用法

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

          -          創建Mock對象的控制對象Control

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

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

          -          設置Control對象到“回放”模式。

          -          進行測試。

          -          在測試完畢后,確認Mock對象已經執行了剛才定義的所有操作。

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

          public void testGetStringHttpServletRequestString() {

          public void testGetBoolean() {

             //創建Mock對象的控制器

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

             //獲取Mock對象

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

             //設置getBoolean中要使用的方法和返回值

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

                  control.replay();

                  //執行測試

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

                  //確認

                  control.verify();

              }

          }

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

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

          -          expectAndReturn,設置期望調用的函數,以及返回值

          -          expectAndThrow,設置期望調用的函數,同時期望該次調用拋出異常

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

          -          setThrowable,設置上次調用拋出的異常

          EasyMock中還可以設置調用所執行的次數,具體細節請參見對應的javaDoc

          4.       使用舉例:

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

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

          mock.getParameter( "test");

          //設置第一次調用request.getParameter的返回值

          control.setReturnValue( null, 1);

          //設置第二次調用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對象使用結束后,務必調用控制器的verify函數,以確認Mock對象的方法得到了調用。

          6.       調用方法的次序,使用Strict。有時,測試代碼依賴于被依賴組件的方法的次序。如在測試與數據庫相關代碼時,測試代碼很有可能是這樣的次序:先打開數據庫鏈接,執行操作,關閉鏈接。為了更好的測試這樣的代碼,可以使用MockControl.createStrictControl()來創建一個嚴格的Mock對象控制器,在其中,他會規定Mock出來的對象的調用次序。

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

          PS:當自己動手實現Mock對象時,不要在Mock對象中實現業務邏輯。

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

          2007年1月17日

          難道我們真的只是做我們應該做的嗎?

          我不知道自己是怎么回事!也不知道到底是因為什么!我的生活永遠都是悲喜交加的!也許一天中就能發生許多的變化!而且也習慣了今天站在很高的地方!明天就摔得很慘!但是自己又是總喜歡說喜歡追求刺激的生活!但我最近我才發現,原來我所追求的生活是天天有追求有收獲的!我可能害怕承擔責任,但是我又想去承擔很多的責任!因為在我看來,只要是領導交給我任務,就代表對我的信任!那么我會盡最大努力去做好!不知道是怎么回事!雖說剛剛上班沒有多長時間!我也不知道這樣算好算壞!我會把現在做的項目當成自己的事情!哪個地方出了問題!我可以很少睡覺!只是想不辜負任何人!但是我又知道在工作中結果比過程重要的多!所以我很失望,也很難受!很多的事情沒有成功,我不知道是我錯還是領導有問題!我并不是想追究責任,我只是不想當一件事情失敗的時候,我所有的努力都不會再被看到!我可以以身體為代價來完成我的努力!只是為了想把事情做好!真的只是想能為領導分擔些事情!但是當我真的抗不住的時候!我又能怎么辦呢!也許工作中本不應該去努力替他人分擔什么的!總之今天領導說了一句讓我很是失望的話!也許可以說是有些傷心吧!所以我想我只做我能做的!做我應該做的!

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

          2006年12月27日

          my heart

          ???剛剛出來工作!連自己都不知道為什么能進入這家公司!不過我的確很是高興!我真的是一直都在努力!現在正在出差!每天都要工作到11點多!也有很多時候是要通宵!不過我很開心!因為我現在過得很是充實!而且我也想來證明自己!我想用我的行動告訴公司的所有人!雖然我現在不是很強!但是我很努力!我會去努力的學習!我一定會在公司中成為重要的角色!
          ???現在工作這邊只有我一個人!很多事情都在我的身上!這幾天幾乎就沒有怎么睡覺!我唯一想做的就是能夠把事情做好!可是真的是遇到了很多困難!每天寫工作日志的時候都不知道應該如何去寫!因為這幾天工作日志幾乎就是一樣的!不是怕領導會說什么!只不過真的覺得自己很沒用啊!(只是發泄!覺得沒有泄氣!哈哈!)真的覺得自己好讓人失望啊!呵呵!現在又要寫工作日報了!調節一下自己!完了繼續開工了!我會告訴自己!盡最大的努力!做好自己的事情!雖然工作講求效率!雖然我有很多的不會!但是至少我是盡力的!我做到無愧于心!我想就夠了!
          ???我會繼續努力!因為 大丈夫!橫行天下!

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

          主站蜘蛛池模板: 兴安盟| 含山县| 宁远县| 长白| 宁南县| 枣庄市| 绵竹市| 黔西县| 道孚县| 明星| 环江| 志丹县| 祁东县| 高要市| 云龙县| 台山市| 长岛县| 安图县| 神池县| 礼泉县| 博兴县| 富锦市| 东乡族自治县| 临漳县| 拉萨市| 灵宝市| 浙江省| 乌拉特中旗| 泽库县| 益阳市| 嵩明县| 巴林右旗| 广元市| 精河县| 武清区| 石家庄市| 雷波县| 石嘴山市| 新沂市| 西乌珠穆沁旗| 宝兴县|