Sky's blog

          我和我追逐的夢

          常用鏈接

          統計

          其他鏈接

          友情鏈接

          最新評論

          easymock教程-創建stub對象


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

              我們來看一個實際使用的例子:

           

              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() 是我們需要測試的三個方法,相同點都是必須調用service.execute(),不同點在于其后對stubService的調用各不相同。而我們假設在這里我們只關心Business類對Service的調用是否如預期,不關心對于StubService的調用,只要程序可以繼續運行就可以了。

              一個正統的做法是手工寫一個StubService的stub 實現,例如:

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


           
          public String method2() {
            
          return "";
           }

          }


              但是如果這個接口復雜方法眾多,則這個stub類不得不實現所有的其他方法,即使完全用不到,因為java的語法限制。

              可以這樣使用easymock來實現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創建了一個mock對象,然后和普通mock對象一樣記錄了期望的行為。不同的是用andStubReturn()替代了andReturn().

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

              最后總結,在適當的時候使用easymock來創建stub對象,對于簡化測試還是能有所幫助的。

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

          主站蜘蛛池模板: 衡山县| 溧阳市| 宜黄县| 林芝县| 庆城县| 兴文县| 松阳县| 洞口县| 镇沅| 石狮市| 南江县| 襄垣县| 肇州县| 安多县| 班玛县| 金秀| 炎陵县| 资兴市| 武胜县| 红安县| 固始县| 睢宁县| 太康县| 百色市| 泸定县| 将乐县| 恭城| 西华县| 聂拉木县| 通许县| 彰化市| 射洪县| 集安市| 安阳县| 日土县| 襄垣县| 汝州市| 定安县| 长沙市| 图木舒克市| 儋州市|