美文网首页
moco代码赏析二

moco代码赏析二

作者: hopelty | 来源:发表于2018-01-26 12:20 被阅读0次

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


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()方法实现你的逻辑。

相关文章

  • moco代码赏析二

    今天来看一下作者的第二次提交。首先看下有哪些改变: src包中改动了四个类,新加了一个接口RequestHandl...

  • moco代码赏析十一

    今天来看一下2012.11.7的后三次提交,这三次提交做的事情是比较统一的:用RequestExtractor、C...

  • moco代码赏析十二

    今天要看的是2012.11.8的唯一一次提交,这次提交还是做了很多工作的。 首先,对测试类MocoTest做了重构...

  • moco代码赏析五

    今天来看一下2012.10.30的后三次提交。 提交一:支持了请求时传入一个流 通过stream()方法把流包装成...

  • moco代码赏析六

    今天看的是2012.11.02那天的三次提交,第一次提交加了一些TODO事项,记下了作者接下来要做什么。第二次提交...

  • moco代码赏析四

    对于作者的第四次提交,我们直接从代码的单元测试类入手,来看看做了哪些改动。 以前的调用方式: 现在的调用方式: 我...

  • moco代码赏析十

    接下来看一看2012.11.7的后五次提交。第一次提交,新引入了一个类HttpServer,由MocoHttpSe...

  • moco代码赏析七

    今天看的是2012.11.6的三次提交。 第一次提交作者更改了包名(package name),第三次提交作者更改...

  • moco代码赏析九

    今天来谈一下目前的代码中是如何使用组合模式的。以下是matcher部分的类图和组合模式的类图: Component...

  • moco代码赏析八

    今天来看一下2012.11.7的前四次提交,在下一篇中再聊那天的后五次提交。 首先来看第一次提交,这一次提交主要完...

网友评论

      本文标题:moco代码赏析二

      本文链接:https://www.haomeiwen.com/subject/louiaxtx.html