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

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

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

    Sky's blog

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

    常用鏈接

    統(tǒng)計(jì)

    其他鏈接

    友情鏈接

    最新評(píng)論

    easymock教程-自定義參數(shù)匹配器

        雖然easymock中提供了大量的方法來進(jìn)行參數(shù)匹配,但是對(duì)于一些特殊場(chǎng)合比如參數(shù)是復(fù)雜對(duì)象而又不能簡(jiǎn)單的通過equals()方法來比較,這些現(xiàn)有的參數(shù)匹配器就無能為力了。easymock為此提供了IArgumentMatcher 接口來讓我們實(shí)現(xiàn)自定義的參數(shù)匹配器。

        我們還是用例子來說話:

        public interface Service {
            
    public void execute(Request request);
        }

        service類的execute()方法接收一個(gè)Request實(shí)例作為參數(shù), Request是一個(gè)javabean:

       public static class Request {

            
    private boolean condition;

            
    private String  value1;

            
    private String  value2;

     
    //ignore getter and setter method
        }

        假設(shè)在我們的這個(gè)單獨(dú)的測(cè)試案例中,我們有以下參數(shù)匹配邏輯: 如果condition為true,則只需要比較value1;如果condition為false,則只需要比較value2. 由于這個(gè)邏輯和默認(rèn)的equals方法不一致,因此我們不能直接使用equals方法,只能實(shí)現(xiàn)自己的參數(shù)匹配器。

    public class RequestMatcher implements IArgumentMatcher {

            
    private boolean condition;

            
    private String  expectedValue;

            
    private RequestMatcher(boolean condition, String expectedValue) {
                
    this.condition = condition;
                
    this.expectedValue = expectedValue;
            }


            @Override
            
    public void appendTo(StringBuffer buffer) {
                buffer.append(
    "RequestMatcher expect(condition=");
                buffer.append(condition);
                buffer.append(
    " expectedValue=");
                buffer.append(expectedValue);
                buffer.append(
    ")");
            }


            @Override
            
    public boolean matches(Object argument) {
                
    if (!(argument instanceof Request)) {
                    
    return false;
                }


                Request request 
    = (Request) argument;
                
    if (condition) {
                    
    return expectedValue.equals(request.getValue1());
                }
     else {
                    
    return expectedValue.equals(request.getValue2());
                }

            }


            
    public static Request requestEquals(boolean condition, String expectedValue) {
                EasyMock.reportMatcher(
    new RequestMatcher(condition, expectedValue));
                
    return null;
            }

        }

        RequestMatcher 是我們定義的參數(shù)匹配器,matches()方法中是參數(shù)匹配邏輯的代碼實(shí)現(xiàn),appendTo()方法用于在匹配失敗時(shí)打印錯(cuò)誤信息,后面我們會(huì)演示這個(gè)方法的使用。然后是最重要的方法requestEquals(),在這里我們通過調(diào)用EasyMock.reportMatcher()告訴easymock我們要用的參數(shù)匹配器。

        在測(cè)試案例中,我們和以往一樣,先創(chuàng)建了mock對(duì)象,然后準(zhǔn)備request對(duì)象作為測(cè)試數(shù)據(jù)。不同的是,我們沒有使用easymock提供的參數(shù)匹配方法,而是通過service.execute(RequestMatcher.requestEquals(expectedCondition, expectedValue)); 來調(diào)用EasyMock.reportMatcher(),以創(chuàng)建我們自定義的參數(shù)匹配器并為它傳入了兩個(gè)必備的參數(shù)expectedCondition和expectedValue。

        上面的測(cè)試案例可以順利通過,我們的參數(shù)匹配器可以正常工作。然后我們來試試參數(shù)匹配不成功的情況

     

        @Test
        
    public void testConditionTrueFailure() {
            
    final boolean expectedCondition = true;
            
    final String expectedValue = "aaa";

            Service service 
    = EasyMock.createMock("service", Service.class);
            Request request 
    = prepareRequest(expectedCondition, "bbb""ccc");
            service.execute(RequestMatcher.requestEquals(expectedCondition, expectedValue));
            EasyMock.expectLastCall();

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

        注意在Request request = prepareRequest(expectedCondition, "bbb", "ccc")中,我們故意設(shè)置value為和期望的不同,當(dāng)然這樣測(cè)試案例就通不過了,

    java.lang.AssertionError:
      Unexpected method call service.execute(net.sourcesky.study.easymock.tutorial.IArgumentMatcherTest$Request@10ef90c):
        service.execute(RequestMatcher expect(condition=true expectedValue=aaa)): expected: 1, actual: 0
     at org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:45)
     at org.easymock.internal.ObjectMethodsFilter.invoke(ObjectMethodsFilter.java:73)
     at $Proxy4.execute(Unknown Source)
     at net.sourcesky.study.easymock.tutorial.IArgumentMatcherTest.testConditionTrueFailure(IArgumentMatcherTest.java:72)

        注意"service.execute(RequestMatcher expect(condition=true expectedValue=aaa)): expected: 1, actual: 0"這行,其中的"RequestMatcher expect(condition=true expectedValue=aaa)"是我們?cè)赼ppendTo()方法中構(gòu)建出來的錯(cuò)誤信息。appendTo()方法只在這個(gè)時(shí)候才被調(diào)用,用于生成可讀性強(qiáng)的錯(cuò)誤信息以便我們?cè)谑r(shí)檢查,因此不要疏忽了這個(gè)方法的實(shí)現(xiàn)。

     

    posted on 2010-11-30 18:18 sky ao 閱讀(3150) 評(píng)論(0)  編輯  收藏 所屬分類: software test

    主站蜘蛛池模板: 你懂的免费在线观看网站| 一级做a毛片免费视频| 91人成网站色www免费下载| 亚洲第一AAAAA片| 久久国产免费一区二区三区| 亚洲av网址在线观看| 最好看最新的中文字幕免费 | 日本特黄特黄刺激大片免费| 亚洲精品乱码久久久久久V| 在线看片无码永久免费aⅴ| 偷自拍亚洲视频在线观看99| 亚洲狠狠爱综合影院婷婷| 国产特黄一级一片免费| 亚洲精品自产拍在线观看动漫| 麻豆高清免费国产一区| 亚洲色少妇熟女11p| 免费成人在线观看| 国产午夜无码精品免费看动漫| 亚洲美女在线观看播放| 午夜毛片不卡免费观看视频| 深夜福利在线免费观看| 亚洲av无码专区国产乱码在线观看| 亚洲一区免费在线观看| 亚洲欧洲无卡二区视頻| 国产精品V亚洲精品V日韩精品 | 日本阿v免费费视频完整版| 国产精品无码亚洲精品2021 | 美女被免费网站视频在线| 在线精品亚洲一区二区小说| **一级毛片免费完整视| 国产精品亚洲二区在线| 黑人精品videos亚洲人| 最近免费中文字幕视频高清在线看| 四虎成人精品国产永久免费无码| 亚洲AV人无码激艳猛片| 日本不卡高清中文字幕免费| 成全视频免费观看在线看| 亚洲性色AV日韩在线观看| 亚洲情综合五月天| 小小影视日本动漫观看免费| 男女作爱在线播放免费网站|