對(duì)于作者的第四次提交,我們直接從代碼的單元測(cè)試類入手才避,來看看做了哪些改動(dòng)橱夭。
以前的調(diào)用方式:
server.request(eqUri("/foo"))).response("bar");
現(xiàn)在的調(diào)用方式:
server.request(eq(uri("/foo"))).response(seq("bar", "blah"));
InputStream is = this.getClass().getClassLoader().getResourceAsStream("foo.response");
server.request(eq(uri("/foo"))).response(stream(is));
我們可以直觀的看到兩處不同:
一、eqUri()方法變成了eq(uri())兩步
二桑逝、response()方法可以通過seq()方法傳入一個(gè)String類型的可變長(zhǎng)數(shù)組
三棘劣、response()方法可以通過stream()方法傳入一個(gè)流
下面來細(xì)致的談一下這三點(diǎn)改動(dòng)。
首先楞遏,eq(uri())這個(gè)方法需要傳入一個(gè)String類型的參數(shù)茬暇,先將參數(shù)包裝成作者自定義的Uri類型首昔,再將Uri類型轉(zhuǎn)換成Matcher類型去進(jìn)行類型匹配,包裝成Uri類型這一動(dòng)作在這一版代碼中并沒有體現(xiàn)很多的作用糙俗,因?yàn)榘b后勒奇,沒有經(jīng)過任何的操作還是轉(zhuǎn)成了Matcher類型,但是作者把eq()方法與uri()方法剝離開巧骚,就可以eq()更多的類型赊颠,后面可以有和Uri類型同級(jí)別的類型,這樣做的好處會(huì)在日后的擴(kuò)展中體現(xiàn)出來劈彪。
第二點(diǎn)竣蹦,seq()方法可以傳入String的可變長(zhǎng)數(shù)組,返回SequenceResponseHandler對(duì)象沧奴,值得一提的是痘括,在這個(gè)對(duì)象中,有一個(gè)計(jì)數(shù)器滔吠,負(fù)責(zé)記錄當(dāng)前調(diào)用了幾次該方法纲菌,根據(jù)這個(gè)數(shù)值可以返回傳入的String數(shù)組中的第幾個(gè),即contents[current()]疮绷。
protected void writeContent(ChannelBuffer buffer) {
buffer.writeBytes(contents[current()].getBytes());
}
private int current() {
int current = this.index;
if (++index >= contents.length) {
index = contents.length - 1;
}
return current;
}
第三點(diǎn)驰后,stream()方法也是同理最后轉(zhuǎn)成了ResponseHandler類型傳入response()方法,但是它支持以流的形式作為參數(shù)傳入矗愧。其實(shí)在實(shí)現(xiàn)上灶芝,作者并沒有真正把讀進(jìn)來的字符串轉(zhuǎn)成流,而是直接轉(zhuǎn)成了response()方法需要的ResponseHandler類型唉韭,而作者其實(shí)在這版代碼中已經(jīng)預(yù)留了Stream類夜涕,后面的提交想必會(huì)把string轉(zhuǎn)成stream再傳入response()方法。
最后我們還可以看到属愤,作者重構(gòu)了他的單元測(cè)試類女器,把代碼中的重復(fù)部分
Content content = Request.Get("http://localhost:8080")
.execute().returnContent();
進(jìn)行提取,重構(gòu)了一個(gè)方法
private void assertContentFromUri(String uri, String expectedContent) throws IOException {
assertThat(get(uri), is(expectedContent));
}
private String get(String uri) throws IOException {
Content content = Request.Get(uri)
.execute().returnContent();
return content.asString();
}