论坛首页 Java企业应用论坛

窥探EasyMock(2)进阶使用篇

浏览 6701 次
精华帖 (0) :: 良好帖 (3) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-01-05   最后修改:2009-01-06

1. 生成 Mock 对象

 

    如何创建一个需要严格遵守调用顺序的mock对象?

 

 

SomeInterface mockObj = createStrictMock(SomeInterface.class);
 

 

    如果你不想对每一个方法设定预期行为,对于这些非预期的方法调用你不想让EasyMock抛出AssertionError,你可以创建一个“nice”的mock对象,所有没有设定预期行为的方法会悄悄地返回一些空值(0, null或者false)。

 

 

SomeInterface mockObj = createNiceMock(SomeInterface.class);
 

 

    当然,如果你使用MockControl来创建Mock对象,都有相应的方法:createStrictControl和createNiceControl。(其实当你调用createMock等方法时,都生成了一个相应的control。)

 

2. 开关调用顺序检查

 

    如果在测试某处你想关闭strict模式,使用:

checkOrder(mockObj, false);
 

    当然,如果想重新开启,可以使用

checkOrder(mockObj, true);

 

3. 设定预期行为和输出

 

    期望一个方法始终返回期望的值,而不管调用次数:

 

expect(mockObj.someAction(1)).andStubReturn("one");
 

 

    下面的方法与此等价:

 

expect(mockObj.someAction(1)).andReturn("one").anyTimes();
 

 

    设定确定的调用次数:

 

expect(mockObj.someAction(1)).andReturn("one").times(3);
 

 

    设定调用次数在某个范围内:

 

expect(mockObj.someAction(1)).andReturn("one").times(3, 5);
 

 

    期望抛出异常:

 

expect(mockObj.someAction(1)).andThrow(someException);
 

 

4. 参数匹配

 

    任意参数:

 

expect(mockObj.someAction(anyInt())).andStubReturn("one");
 

 

    当然,相应的有anyObject(), anyChar()等等。

 

    在参数上应用逻辑操作:

 

expect(mockStatement.executeQuery(and(startsWith("select"), endsWith("order;")))).andReturn(mockResultSet);

 

    EasyMock提供大量其它的逻辑操作。

 

 

    自定义参数匹配器:

 

expect(mockStatement.executeQuery(SQLEquals("SELECT * FROM ORDER;"))).andReturn(mockResultSet);
 

 

 

private static String SQLEquals(String in) {
        reportMatcher(new SQLEquals(in));
        return in;
    }

    private static class SQLEquals implements IArgumentMatcher {

        private String expectedSql;

        public SQLEquals(String expectedSql) {
            this.expectedSql = expectedSql;
        }

        public boolean matches(Object actualSql) {
            if (actualSql == null && expectedSql == null)
                return true;
            if (actualSql.getClass() == String.class)
                return expectedSql.equalsIgnoreCase((String) actualSql);
            return false;
        }

         // others omited.
    }

 

5. 没有结束

 

    EasyMock还提供了太多其他的功能,大家还是查API吧。

论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics