moco代码赏析二

今天来看一下作者的第二次提交。首先看下有哪些改变:


image.png

src包中改动了四个类,新加了一个接口RequestHandler,还改动了单元测试类。我们可以先从单元测试类入手,有两个改动,一:重构了一部分代码,从每个单元测试方法中提取出server()方法代码如下:

    private MocoServer server;

    @Before
    public void setUp() throws Exception {
        server = server(8080);
    }

二:增加了一个新的单元测试方法:

    public void should_call_function_specified_request() {
        StubRequestHandler handler = new StubRequestHandler();
        server.withUri("/foo").withHandler(handler).response("bar");

        running(server, new Runnable() {
            @Override
            public void run() {
                try {
                    Content content = Request.Get("http://localhost:8080/foo")
                            .execute().returnContent();
                    assertThat(content.asString(), is("bar"));
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        });

        assertThat(handler.getResult(), is("/foo"));
    }

这个测试方法跟以前的不同之处在于,在MocoServer对象调用response()方法之前可以自己先指定一个RequestHandler类型的handler,然后查看MocoHandler类,有如下改动:

    private ChannelFuture handleResponse(HttpRequest request, BaseRequestSetting requestSetting, Channel channel) {
        requestSetting.handleRequest(request, channel);
        return channel.write(createResponse(requestSetting));
    }

由原先的writeResponse()方法调用createResponse()方法,变成了writeResponse()方法调用handleResponse()方法,再由handleResponse()方法调用createResponse()方法,中间加了一步调用handleResponse()的过程,下图为handleResponse()方法的代码:

    private ChannelFuture handleResponse(HttpRequest request, BaseRequestSetting requestSetting, Channel channel) {
        requestSetting.handleRequest(request, channel);
        return channel.write(createResponse(requestSetting));
    }

代码中handleResponse()又调用了handleRequest(),后者的作用是检查发送request时,是否添加了RequestHandler对象,如果添加了该类型对象则调用该对象的handle()方法。

    public void handleRequest(HttpRequest request, Channel channel) {
        if (handler == null) {
            return;
        }

        handler.handle(request, channel);
    }
public interface RequestHandler {
    void handle(HttpRequest request, Channel channel);
}

这也就意味着当你想要自己指定RequestHandler时需要重写handle()方法,在handle()方法实现你的逻辑。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,526评论 25 709
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,952评论 18 399
  • 老师,您像蜡烛一样,燃烧了自己,却照亮了别人;您像春蚕,奉献了自己,装饰了别人;您像粉笔,留下知识,牺牲了...
    卢芯源阅读 942评论 0 0
  • 老家将近一年无人居住,今天小妹陪老妈回去一趟,发来一组照片,思绪久久未能平静…… 院子里长满...
    悠悠玲阅读 1,904评论 0 3
  • 冠军组30号张亮开营作业:我的21天梦想清单
    张亮先生阅读 1,625评论 2 1