Sky's blog

          我和我追逐的夢(mèng)

          導(dǎo)航

          <2010年11月>
          31123456
          78910111213
          14151617181920
          21222324252627
          2829301234
          567891011

          留言簿(8)

          隨筆分類

          隨筆檔案

          閱讀排行榜

          評(píng)論排行榜

          常用鏈接

          統(tǒng)計(jì)

          其他鏈接

          友情鏈接

          最新評(píng)論

          easymock教程-創(chuàng)建stub對(duì)象


              前面教程中有個(gè)章節(jié)討論到mock和stub的概念差別,一般來說easymock如其名所示,主要是用來做mock用的,但是easymock中也提供有對(duì)stub的支持, 主要體現(xiàn)在andStubAnswer(),andStubDelegateTo(),andStubReturn(),andStubThrow()和asStub()等方法的使用上。

              我們來看一個(gè)實(shí)際使用的例子:

           

              public class Business {
                  
          private Service     service;

                  
          private StubService stubService;

                  
          public void execute1() {
                      
          if (service.execute()) {
                          stubService.method1();
                      }

                  }


                  
          public void execute2() {
                      
          if (service.execute()) {
                          stubService.method2();
                      }

                  }


                  
          public void execute3() {
                      
          if (service.execute()) {
                          stubService.method1();
                          stubService.method2();
                      }

                  }


                  
          public void setStubService(StubService stubService) {
                      
          this.stubService = stubService;
                  }


                  
          public void setService(Service service) {
                      
          this.service = service;
                  }

              }


              
          private interface Service {
                  
          public boolean execute();
              }


              
          private interface StubService {

                  
          public String method1();

                  
          public String method2();
              }

              這里的Business類依賴到Service和StubService,execute1() / execute2() / execute3() 是我們需要測(cè)試的三個(gè)方法,相同點(diǎn)都是必須調(diào)用service.execute(),不同點(diǎn)在于其后對(duì)stubService的調(diào)用各不相同。而我們假設(shè)在這里我們只關(guān)心Business類對(duì)Service的調(diào)用是否如預(yù)期,不關(guān)心對(duì)于StubService的調(diào)用,只要程序可以繼續(xù)運(yùn)行就可以了。

              一個(gè)正統(tǒng)的做法是手工寫一個(gè)StubService的stub 實(shí)現(xiàn),例如:

          private class StubServiceImpl {
           
          public String method1() {
            
          return "";
           }


           
          public String method2() {
            
          return "";
           }

          }


              但是如果這個(gè)接口復(fù)雜方法眾多,則這個(gè)stub類不得不實(shí)現(xiàn)所有的其他方法,即使完全用不到,因?yàn)閖ava的語法限制。

              可以這樣使用easymock來實(shí)現(xiàn)stub:

           

          public class BusinessTest {

              
          private Business      business;

              
          private IMocksControl mocksControl;

              
          private Service       service;

              @Before
              
          public void init() {
                  business 
          = new Business();
                  business.setStubService(prepareStubService());
                  mocksControl 
          = EasyMock.createStrictControl();
                  service 
          = mocksControl.createMock("service", Service.class);
                  business.setService(service);
              }


              
          private StubService prepareStubService() {
                  StubService service 
          = EasyMock.createMock("stubService", StubService.class);
                  service.method1();
                  EasyMock.expectLastCall().andStubReturn(
          "");
                  service.method2();
                  EasyMock.expectLastCall().andStubReturn(
          "");
                  EasyMock.replay(service);
                  
          return service;
              }


              @Test
              
          public void testExecute1() {
                  EasyMock.expect(service.execute()).andReturn(
          true);
                  mocksControl.replay();
                  business.execute1();
                  mocksControl.verify();
              }


              @Test
              
          public void testExecute2() {
                  EasyMock.expect(service.execute()).andReturn(
          false);
                  mocksControl.replay();
                  business.execute2();
                  mocksControl.verify();
              }


              @Test
              
          public void testExecute3() {
                  EasyMock.expect(service.execute()).andReturn(
          true);
                  mocksControl.replay();
                  business.execute3();
                  mocksControl.verify();
              }

          }

           

              在方法prepareStubService()中,我們通過easymock創(chuàng)建了一個(gè)mock對(duì)象,然后和普通mock對(duì)象一樣記錄了期望的行為。不同的是用andStubReturn()替代了andReturn().

              然后我們直接調(diào)用EasyMock.replay(service),注意在這個(gè)測(cè)試案例中,我們另外創(chuàng)建了一個(gè)mocksControl并通過這個(gè)mocksControl創(chuàng)建了我們關(guān)注的Service接口的mock對(duì)象,它的record/replay/和verify()是和StubService完全分離的。這樣做的好處是在execute1() / execute2() / execute3()的測(cè)試案例中,我們完全不必額外關(guān)心這個(gè)stub,所有的事情在init()函數(shù)中就已經(jīng)準(zhǔn)備好了。這樣做的好處顯而易見,execute1() / execute2() / execute3()的測(cè)試案例中,代碼和測(cè)試邏輯都簡(jiǎn)單了。

              最后總結(jié),在適當(dāng)?shù)臅r(shí)候使用easymock來創(chuàng)建stub對(duì)象,對(duì)于簡(jiǎn)化測(cè)試還是能有所幫助的。

          posted on 2010-11-23 17:51 sky ao 閱讀(2139) 評(píng)論(0)  編輯  收藏 所屬分類: software test

          主站蜘蛛池模板: 长海县| 正镶白旗| 读书| 和林格尔县| 屯留县| 庆元县| 溧阳市| 华坪县| 潜山县| 凤冈县| 城固县| 临江市| 青神县| 夏河县| 晋州市| 淮安市| 老河口市| 镇康县| 南宁市| 名山县| 连平县| 乐山市| 忻城县| 枞阳县| 汉中市| 长顺县| 腾冲县| 营口市| 广元市| 襄垣县| 三亚市| 历史| 星子县| 门头沟区| 南雄市| 乌鲁木齐县| 崇州市| 津南区| 新巴尔虎左旗| 始兴县| 遂平县|