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

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

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

    【轉(zhuǎn)帖】jMock Argument Interceptor - 一種獨(dú)特的設(shè)計(jì)思路

    jMock Argument Interceptor - 一種獨(dú)特的設(shè)計(jì)思路
    Motivation
    An Object you need to test is constructing another complex object internally which you cannot access and this object is passed to a collaborator you can replace with a mock.
    Solution
    Write an Interceptor (a custom jMock Stub ) to intercept the argument passed to the mocked method. The Interceptor exposes the argument, allowing for standard jUnit assertions.
    Alternatives

        * Use a custom jMock Constraint when the argument's asserted state is simple.
        * Use a Fake Object when a class cannot be dynamically mocked.

    Example

    public void testInterceptArgument() {

        List arguments = new ArrayList();

        Mock mockSubmissionTracker = mock(SubmissionTracker.class);
        mockSubmissionTracker.expects(once()).method("record").will(captureArgumentsIn(arguments));

        SecretLottery lotto = new SecretLottery( (SubmissionTracker)mockSubmissionTracker.proxy());

        lotto.createTicket();

        LotteryTicket ticket = (LotteryTicket) arguments.get(0);
        assertEquals("Secret Number", 12345, ticket.number);
    }

    private Stub captureArgumentsIn(List argumentList) {

        return new ArgumentInterceptor(argumentList);

    }

    class ArgumentInterceptor implements Stub {

        List arguments;

        public ArgumentInterceptor(List argumentList) {
            arguments = argumentList;
        }

        public Object invoke(Invocation invocation) throws Throwable {
            arguments.addAll(invocation.parameterValues);
            return null;
        }

        public StringBuffer describeTo(StringBuffer buffer) {
            return buffer;
        }
    }

    The Traditional jMock approach
    The traditional way to handle this with jMock is to create a custom Constraint to verify the argument passed into the mocked method. Unfortunatly, this technique can produce a less explict test and a lot of supporting code. The above example handled with a traditional jMock Constraint would look like the following...

    public void testInterceptArgument() {

        Mock mockSubmissionTracker = mock(SubmissionTracker.class);
        mockSubmissionTracker.expects(once()).method("record").with(ticketNumber(12345));

        SecretLottery lotto = new SecretLottery( (SubmissionTracker) mockSubmissionTracker.proxy());

        lotto.createTicket();
    }

    private Constraint ticketNumber(final int ticketNumber) {

        return new Constraint() {

            public boolean eval(Object arg) {

                LotteryTicket ticket = (LotteryTicket) arg;  
                return ticketNumber == ticket.number;
            }

            public StringBuffer describeTo(StringBuffer buffer) {
                return buffer.append(ticketNumber);
            }
        }
    }

    While this example works fairly well, each new test method would likely require its own Constraint. When the verification in the eval method becomes complex, it can become difficult to determine why a test is failing. An Argument Interceptor allows for traditional jUnit assertions, providing clearer failures for complex verfications.

    posted on 2011-01-31 22:24 koradji 閱讀(250) 評(píng)論(0)  編輯  收藏 所屬分類: unit testing


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿(2)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    收藏夾

    db2

    dos

    Groovy

    Hibernate

    java

    WAS

    web application

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲影视自拍揄拍愉拍| 国产亚洲精品AAAA片APP| 国产va精品免费观看| 蜜芽亚洲av无码一区二区三区| 亚洲JIZZJIZZ中国少妇中文| 99在线观看精品免费99| 亚洲欧洲无码一区二区三区| 亚洲国产综合精品中文字幕| 人妻无码一区二区三区免费 | 免费观看的毛片手机视频| 人禽伦免费交视频播放| 亚洲精品中文字幕乱码| 国产精品视频免费一区二区三区| 两个人日本WWW免费版| 亚洲国产精品人久久电影| 亚洲国产精品一区二区九九 | 亚洲AV无码一区二区三区国产 | 狠狠热精品免费观看| 亚洲精品高清国产麻豆专区| 五月婷婷亚洲综合| 日韩精品无码区免费专区| 国产一级a毛一级a看免费人娇| 自拍日韩亚洲一区在线| 亚洲AV永久精品爱情岛论坛| 永久免费bbbbbb视频| 最近高清中文字幕无吗免费看| 国产成人精品免费大全| 亚洲人片在线观看天堂无码| 亚洲AV无码不卡在线播放| 免费一看一级毛片人| 免费观看的毛片大全| 成人A片产无码免费视频在线观看 成人电影在线免费观看 | a级大片免费观看| 成a人片亚洲日本久久| 亚洲xxxx18| 亚洲第一精品福利| 国产亚洲精品福利在线无卡一| 黄网址在线永久免费观看| 国产高清免费视频| 久久精品一区二区免费看| 91免费国产视频|