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

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

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

    Sky's blog

    我和我追逐的夢

    常用鏈接

    統(tǒng)計

    其他鏈接

    友情鏈接

    最新評論

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


        前面教程中有個章節(jié)討論到mock和stub的概念差別,一般來說easymock如其名所示,主要是用來做mock用的,但是easymock中也提供有對stub的支持, 主要體現(xiàn)在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() 是我們需要測試的三個方法,相同點都是必須調(diào)用service.execute(),不同點在于其后對stubService的調(diào)用各不相同。而我們假設(shè)在這里我們只關(guān)心Business類對Service的調(diào)用是否如預(yù)期,不關(guān)心對于StubService的調(diào)用,只要程序可以繼續(xù)運行就可以了。

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

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


     
    public String method2() {
      
    return "";
     }

    }


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

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

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

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

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

    主站蜘蛛池模板: 最近2019年免费中文字幕高清| 国产男女性潮高清免费网站| 自拍偷区亚洲国内自拍| 日韩午夜免费视频| 男女拍拍拍免费视频网站| 久久亚洲春色中文字幕久久久| 免费观看的av毛片的网站| 国产免费久久精品99久久| 亚洲国产最大av| 久久综合亚洲色HEZYO国产| 国产h视频在线观看网站免费| 免费国产黄线在线观看| 全黄A免费一级毛片| 亚洲婷婷在线视频| 亚洲综合亚洲综合网成人| 在线看片无码永久免费视频| xxxxx做受大片视频免费| 亚洲熟伦熟女专区hd高清| 国产亚洲精品观看91在线| 韩国日本好看电影免费看| 最近免费中文字幕大全免费 | 亚洲大香伊人蕉在人依线| 免费人成在线观看网站视频 | 一个人看的www视频免费在线观看| 亚洲精品一区二区三区四区乱码 | 手机看黄av免费网址| 成人国产精品免费视频| 亚洲乱色伦图片区小说| 亚洲综合无码一区二区| 在线观看亚洲天天一三视| 午夜一级毛片免费视频| 永久在线免费观看| 国产精品高清视亚洲精品| 国产亚洲精品精华液| 亚洲国产精品第一区二区三区| 成人AV免费网址在线观看| 亚洲免费精彩视频在线观看| 国产精品美女久久久免费| 精品亚洲成A人在线观看青青| 亚洲国产精品成人综合色在线婷婷 | 综合一区自拍亚洲综合图区|