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

你可能感兴趣的:(moco代码赏析二)