Sky's blog

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

          常用鏈接

          統(tǒng)計(jì)

          其他鏈接

          友情鏈接

          最新評(píng)論

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


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

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

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

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


           
          public String method2() {
            
          return "";
           }

          }


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

              可以這樣使用easymock來(lái)實(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()中,我們通過(guò)easymock創(chuàng)建了一個(gè)mock對(duì)象,然后和普通mock對(duì)象一樣記錄了期望的行為。不同的是用andStubReturn()替代了andReturn().

              然后我們直接調(diào)用EasyMock.replay(service),注意在這個(gè)測(cè)試案例中,我們另外創(chuàng)建了一個(gè)mocksControl并通過(guò)這個(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)備好了。這樣做的好處顯而易見(jiàn),execute1() / execute2() / execute3()的測(cè)試案例中,代碼和測(cè)試邏輯都簡(jiǎn)單了。

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

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

          主站蜘蛛池模板: 富锦市| 泰安市| 阿瓦提县| 南华县| 木兰县| 永善县| 珲春市| 文昌市| 大洼县| 弥渡县| 喀喇| 新源县| 福州市| 平昌县| 宝清县| 襄城县| 华容县| 镶黄旗| 当涂县| 汝南县| 巩义市| 区。| 通河县| 房产| 永济市| 含山县| 灵璧县| 柯坪县| 宁城县| 靖州| 贵溪市| 武川县| 宣汉县| 陆河县| 南宁市| 清涧县| 福清市| 石门县| 南郑县| 汽车| 云霄县|