Sky's blog

          我和我追逐的夢

          常用鏈接

          統(tǒng)計

          其他鏈接

          友情鏈接

          最新評論

          easymock教程-命名mock對象

              在創(chuàng)建mock對象的時候,我們可以命名mock對象。

              前面我們談到easymock中有三種mock對象,分別用下面三個方法創(chuàng)建:

          createMock(Class<T> toMock)
          createStrictMock(Class
          <T> toMock)
          createNiceMock(Class
          <T> toMock)

              帶有命名功能的方法也有對應(yīng)的三種:

          createMock(String name, Class<T> toMock)
          createStrictMock(String name, Class
          <T> toMock)
          createNiceMock(String name, Class
          <T> toMock)

              命名mock對象有什么好處呢?其實就是一點,即在當測試案例因為某個mock對象的狀態(tài)或行為不符合要求而失敗的時候,在異常信息里面可以輸出這個mock對象的名稱。

              我們用實際的例子來看,同樣是創(chuàng)建一個mock對象,然后調(diào)用一個沒有record的方法,easymock報錯退出的測試案例。

          1. 不命名

              Service service = EasyMock.createMock(Service.class);

              異常信息如下:

          java.lang.AssertionError:
            Unexpected method call execute():
           at org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:45)
           at org.easymock.internal.ObjectMethodsFilter.invoke(ObjectMethodsFilter.java:73)
           at net.sourcesky.study.easymock.tutorial.$Proxy4.execute(Unknown Source)
           at net.sourcesky.study.easymock.tutorial.NamingMockTest$Business.execute(NamingMockTest.java:11)
           at net.sourcesky.study.easymock.tutorial.NamingMockTest.testExecute(NamingMockTest.java:31)
           ......

              這里的錯誤信息"Unexpected method call execute()",只指出了發(fā)生錯誤的是execute()方法,并未指出具體是哪個mock對象。
             
              當測試案例簡單時,比如就一兩個mock對象,我們可以直接從方法名上就看出是哪個mock對象。但是當mock對象多了之后,尤其是方法很多的時候,就會浪費時間。


          2. 命名后

          Service service = EasyMock.createMock("service", Service.class);

              異常信息如下:

          java.lang.AssertionError:
            Unexpected method call service.execute():
           at org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:45)
           at org.easymock.internal.ObjectMethodsFilter.invoke(ObjectMethodsFilter.java:73)
           at net.sourcesky.study.easymock.tutorial.$Proxy4.execute(Unknown Source)
           at net.sourcesky.study.easymock.tutorial.NamingMockTest$Business.execute(NamingMockTest.java:11)
           at net.sourcesky.study.easymock.tutorial.NamingMockTest.testExecute(NamingMockTest.java:30)

              差別只在錯誤信息中"Unexpected method call serviceMock.execute()" 包含serviceMock的字樣,因此我們可以快遞定位到具體的mock對象。

              命名mock對象在初次編寫測試案例時用處還不是很明顯,因為編寫者當時肯定對代碼很熟悉。但是當另外一個開發(fā)人員因為某此修改代碼造成測試案例不能通過時,由于這個開發(fā)人員對代碼的熟悉程度不夠,因此命名mock對象可以對他有所幫助,方便維護。

              命名之后的mock對象,還有一個特殊的地方就是toString()方法將返回該mock對象的名稱,以代碼為例:

                  Service service = EasyMock.createMock("service", Service.class);
                  System.out.println(service.toString());

              輸出就是"service",對比不命名mock對象的情況:

                  Service service = EasyMock.createMock(Service.class);
                  System.out.println(service.toString());

              得到的輸出是"EasyMock for interface net.sourcesky.study.easymock.tutorial.NamingMockTest$Service".

           

          posted on 2010-11-29 16:34 sky ao 閱讀(2489) 評論(1)  編輯  收藏 所屬分類: software test

          評論

          # re: easymock教程-命名mock對象 2010-11-30 11:41 百思寒羽絨被

          學習了,呵呵  回復  更多評論   

          主站蜘蛛池模板: 黑龙江省| 陈巴尔虎旗| 梁山县| 大名县| 永德县| 府谷县| 宁波市| 丰台区| 平阴县| 高邑县| 博兴县| 高阳县| 通河县| 寿宁县| 慈利县| 无棣县| 花垣县| 株洲市| 沅陵县| 定陶县| 界首市| 滨海县| 原阳县| 金乡县| 安溪县| 本溪市| 嵩明县| 台前县| 称多县| 郑州市| 深水埗区| 巴东县| 新竹市| 高安市| 新平| 上饶县| 化州市| 江孜县| 乌海市| 湘乡市| 眉山市|