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

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

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

    Sky's blog

    我和我追逐的夢

    常用鏈接

    統計

    其他鏈接

    友情鏈接

    最新評論

    easymock教程-運行時返回值或者異常

            前面的教程中,我們看到easymock可以通過expect方法來設定mock方法的返回值或者異常,但是注意這些案例中設置的返回值都是在調用被測試的類的方法前就已經確定下來的,即我們其實在測試類的代碼運行前(實際是在EasyMock.replay()方法調用前)就已經"預知"了返回結果。

        但是在某些情況下,我們可能無法預知返回值,比如我們需要根據輸入的參數值來決定返回什么,而這個參數可能無法在record階段獲得。因此在mock方法中我們無法在record階段就決定應該返回什么。

        對于這種場景,easymock提供了IAnswer接口和andAnswer()方法來提供運行時決定返回值或者異常的機制。

        我們來看一個簡單的例子:

        public class Business {
            
    private Service service;

            
    public void execute() {
                
    int count = ramdonInt();
                
    int result = service.execute(count);
            }


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


            
    private int ramdonInt() {
                Random random 
    = new Random();
                
    return random.nextInt() / 10000;
            }

        }


        
    public interface Service {
            
    public int execute(int count);
        }

        在Business的execute()方法中,需要調用service.execute(int count)方法,而傳入的參數count是需要運行時才能確定的,這里為了簡單我們random了一個int來模擬這種情況。

        然后看測試案例

        @Test
        
    public void testRuntimeReturn() {
            Business business 
    = new Business();
            Service service 
    = EasyMock.createMock(Service.class);
            business.setService(service);
            EasyMock.expect(service.execute(EasyMock.anyInt())).andAnswer(
    new IAnswer<Integer>() {
                
    public Integer answer() throws Throwable {
                    Integer count 
    = (Integer) EasyMock.getCurrentArguments()[0];
                    
    return count * 2;
                }

            }
    );

            EasyMock.replay(service);
            business.execute();
            EasyMock.verify(service);
        }

        這里我們通過EasyMock.expect(service.execute(EasyMock.anyInt()))來接受任意值的count參數輸入,andAnswer(new IAnswer<Integer>() {}) 讓我們可以指定一個IAnswer的實現類來給出返回值。在這個IAnswer的實現類中,我們通過EasyMock.getCurrentArguments()[0]獲取到service.execute()方法的第一個參數,然后簡單的運用count*2規則給出返回值。這里的EasyMock.getCurrentArguments()方法可以獲取到運行時的參數列表,不過注意這個方法對重構不夠友好,如果參數列表發生變化則必須手工修改對象的獲取參數的代碼。

        下面是一個運行時拋出異常的例子,簡單起見我們通過設置exception的message來在錯誤信息中傳遞運行時的count值。

       @Test
        
    public void testRuntimeException() {
            Business business 
    = new Business();
            Service service 
    = EasyMock.createMock(Service.class);
            business.setService(service);
            EasyMock.expect(service.execute(EasyMock.anyInt())).andAnswer(
    new IAnswer<Integer>() {
                
    public Integer answer() throws Throwable {
                    Integer count 
    = (Integer) EasyMock.getCurrentArguments()[0];
                    
    throw new RuntimeException("count=" + count);
                }

            }
    );

            EasyMock.replay(service);
            
    try {
                business.execute();
                fail(
    "should throw RuntimeException");
            }
     catch (RuntimeException e) {
                assertTrue(e.getMessage().indexOf(
    "count="!= -1);
                
    //get count from message
                EasyMock.verify(service);
            }

        }

        除了IAnswer接口外,easymock中還有另外一個方式可以完成類似的功能,就是使用andDelegate()方法,

        public class ServiceStub implements Service {
            
    public int execute(int count) {
                
    return count * 2;
            }

        }


        @Test
        
    public void testRuntimeReturn() {
            Business business 
    = new Business();
            Service service 
    = EasyMock.createMock(Service.class);
            business.setService(service);
            EasyMock.expect(service.execute(EasyMock.anyInt())).andDelegateTo(
    new ServiceStub());

            EasyMock.replay(service);
            business.execute();
            EasyMock.verify(service);
        }

        這里需要先創建一個Service類的實現類和一個實例,然后通過andDelegateTo()將這個stub的實例傳進去,注意這里delegate進去的實例必須是mock對象接口相同。

        delegateTo方式實際上是我們手工創建了stub(mock和stub的概念及差別請參考本教程的"mock和stub"一文),這和我們使用easymock的初衷有所違背。而且當這個接口有眾多方法時,創建這樣一個stub會顯得很痛苦,不如使用IAnswer方便直接。

    posted on 2010-11-30 16:36 sky ao 閱讀(3607) 評論(0)  編輯  收藏 所屬分類: software test

    主站蜘蛛池模板: 亚洲高清中文字幕| 亚洲中文字幕一二三四区| 无码永久免费AV网站| a级毛片100部免费观看| 亚洲AV无码一区二区三区性色| 久久亚洲精品国产精品| 一本色道久久综合亚洲精品高清| AV免费网址在线观看| 久久99精品免费视频| 国产精品永久免费视频| 亚洲AV无码一区二区三区牲色| 亚洲冬月枫中文字幕在线看| 久久精品亚洲日本佐佐木明希| 亚洲av无码成人精品区在线播放 | 免费国产黄网站在线看| 亚洲美女视频网站| 亚洲人成伊人成综合网久久久| 日本免费福利视频| 国产香蕉九九久久精品免费| 97在线视频免费播放| 18禁在线无遮挡免费观看网站| 色婷婷综合缴情综免费观看| 亚洲av午夜国产精品无码中文字| 国产成人亚洲精品| 亚洲冬月枫中文字幕在线看| 亚洲视频免费在线看| 亚洲天堂中文资源| 亚洲AV无码久久精品成人| 亚洲熟女一区二区三区| 亚洲性在线看高清h片| 亚洲乱码国产一区网址| 亚洲国产精品第一区二区三区| 国产乱子伦精品免费无码专区| 国产精品久久免费视频| 日本xxwwxxww在线视频免费| 免费精品一区二区三区在线观看| 成人毛片18女人毛片免费| 好爽…又高潮了免费毛片| 免费的涩涩视频在线播放| 日韩视频免费一区二区三区| 国产精品另类激情久久久免费 |