<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 閱讀(2137) 評論(0)  編輯  收藏 所屬分類: software test

    主站蜘蛛池模板: 精品无码免费专区毛片| 免费人成无码大片在线观看| 亚洲色大情网站www| 亚洲国产精品综合久久一线| 好紧我太爽了视频免费国产 | 久久青青草原亚洲AV无码麻豆 | 免费一级e一片在线播放| a级在线观看免费| 亚洲午夜无码久久久久软件| 亚洲中文字幕无码不卡电影| 青青草a免费线观a| 国产日韩久久免费影院| 国产色在线|亚洲| 久久亚洲综合色一区二区三区| 在线免费观看毛片网站| 国产免费拔擦拔擦8X高清在线人| 亚洲色精品VR一区区三区| 亚洲精品无码成人片久久| 韩国日本好看电影免费看| 99在线在线视频免费视频观看| 污网站在线观看免费| 亚洲大香人伊一本线| 亚洲精品无码专区在线在线播放 | 亚洲福利中文字幕在线网址| 免费无码又爽又刺激高潮视频| 菠萝菠萝蜜在线免费视频| 亚洲妓女综合网99| 国产亚洲综合色就色| 啊v在线免费观看| AV免费网址在线观看| 亚洲视频在线观看免费| 一级做a爱过程免费视频高清| 学生妹亚洲一区二区| 亚洲色欲色欲综合网站| 亚洲综合最新无码专区| 国产一精品一aⅴ一免费| 一二三四免费观看在线视频中文版| 免费在线看污视频| 国产免费播放一区二区| 国产成人精品日本亚洲语音| 国产成+人+综合+亚洲专|