返回介绍

2.3 MockService

发布于 2024-08-17 23:46:12 字数 3393 浏览 0 评论 0 收藏 0

在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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文