2.3 MockService
在App团队与MobileAPI团队协同开发的过程中,经常会遇到因为MobileAPI接口还没好而App又急等着用的情况。
正常的流程是:
1)MobileAPI开发人员会事先和App开发人员定义MobileAPI接口,包括API名称、参数、返回JSON格式。
2)MobileAPI按照上述约定写一个Mock接口,部署到测试环境,该Mock接口中没有任何逻辑实现,在返回结果中硬编码返回一些JSON数据。我们假设这个工作应该是很快的。
3)App开发人员基于上述测试环境Mock接口,进行开发。
4)MobileAPI接口完成后,通知App开发人员,对真实逻辑进行联调。
以上4步,如果是正常实施,是没有问题的,但是问题经常出在第2步,MobileAPI开发人员来不及提供Mock接口。
另一种情况是,随着App开发工作的进行,App开发人员会发现原先约定的那些字段不够用,所以就会要求MobileAPI开发人员频繁修改Mock接口并部署到测试环境,这是一个很浪费时间的工作。
其实,就是因为App与MobileAPI之间有依赖,我们需要解除这种依赖。为此我们要在App端设计自己的MockService,这样就在完成上述步骤1——约定MobileAPI接口参数和返回JSON格式后,在App端Mock自己的数据,直到功能开发完成,而不会被任何人阻塞。App开发完成后,肯定也积累了一些修改意见,这时候可以请MobileAPI开发人员汇总在一起进行修改。
设计App端MockService包括如下几个关键点:
1)对需要Mock数据的MobileAPI接口,通过在url.xml中配置Node节点MockClass属性,来指定要使用那个Mock子类生成的数据:
<Node Key="getWeatherInfo" Expires="300" NetType="get" MockClass="com.youngheart.mockdata.MockWeatherInfo" Url="http://www.weather.com.cn/data/sk/101010100.html" />
这里将使用com.mockdata.mockdata包下的MockWeatherInfo子类来解析。
2)我使用了反射工厂来设计MockService。MockService类是基类,它有一个抽象方法getJsonData,用于返回手动生成的Mock数据。
public abstract class MockService { public abstract String getJsonData(); }
每个要Mock数据的MobileAPI接口,都对应一个继承自MockService的子类,都要实现各自的getJsonData方法,返回不同的JSON数据。
比如在上述url.xml中声明的MockWeatherInfo,它对应的类实现如下:
public class MockWeatherInfo extends MockService { @Override public String getJsonData() { WeatherInfo weather = new WeatherInfo(); weather.setCity("Beijing"); weather.setCityid("10000"); Response response = getSuccessResponse(); response.setResult(JSON.toJSONString(weather)); return JSON.toJSONString(response); } }
以后每添加一个新的Mock类,我们都将其放置在mockdata包下,如图2-2所示。
图2-2 mockdata包
3)接下来介绍如何实现反射机制。
主要的改造工作在RemoteService类的invoke方法中,根据是否在url.xml中指定了MockClass值来决定,是调用线上MobileAPI还是从本地MockService直接取假数据。
如果MockClass有值,就把这个值反射为一个具体的类,比如MockWeatherInfo,然后调用它的getJsonData方法。
public void invoke(final BaseActivity activity, final String apiKey, final List<RequestParameter> params, final RequestCallback callBack) { final URLData urlData = UrlConfigManager.findURL(activity, apiKey); if (urlData.getMockClass() != null) { try { MockService mockService = (MockService) Class.forName( urlData.getMockClass()).newInstance(); String strResponse = mockService.getJsonData(); final Response responseInJson = JSON.parseObject(strResponse, Response.class); if (callBack != null) { if (responseInJson.hasError()) { callBack.onFail(responseInJson.getErrorMessage()); } else { callBack.onSuccess(responseInJson.getResult()); } } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } else { HttpRequest request = activity.getRequestManager().createRequest( urlData, params, callBack); DefaultThreadPool.getInstance().execute(request); } }
有了MockService这个利器,对于作者来说,本书接下来的内容将会轻松很多,因为不需要搭建自己的服务器,全都用MockService在本地编写假数据即可。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论