moco代码赏析二
2018-01-26 本文已影响0人
hopelty
今天来看一下作者的第二次提交。首先看下有哪些改变:

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