from:http://www.iteye.com/topic/310313
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吧。
黑洞@heidsoft
Github:https://github.com/heidsoft
微博:http://weibo.com/liuganbin
热衷云计算和大数据
关注CloudStack,OpenStack,Linux c/c++/python/java
关注研究新技术