MockWebServer淺談
按照官方文檔定義,MockWebServer是一個可腳本化的用于測試HTTP客戶端的Web服務器。
簡介
按照官方文檔定義,MockWebServer是一個可腳本化的用于
測試HTTP客戶端的Web
服務器。
主要用于測試你的應用在進行HTTP、HTTPS請求時是否按照預期的行為動作。使用該工具,你可以驗證應用的請求是否符合預期,你可以選擇返回的響應。
MockWebServer包含了所有的HTTP棧,所以可以測試所有的事。甚至可以直接將真實Web服務器中的HTTP響應內容復制過來,以創建相應的
測試用例。此外,還可以測試應用在糟糕的網絡環境下的表現,比如500錯誤或者響應返回緩慢。
示例
MockWebServer使用方法和Mockito類似,按照如下步驟。
編寫模擬腳本
運行應用程序代碼
驗證做出的請求是否符合預期
下面是官方給的示例代碼:
public void test() throws Exception() {
// 創建一個 MockWebServer
MockWebServer server = new MockWebServer();
// 設置響應
server.enqueue(new MockResponse().setBody("hello, world!"));
server.enqueue(new MockResponse().setBody("sup, bra?"));
server.enqueue(new MockResponse().setBody("yo dog"));
// 啟動服務
// Start the server.
server.start();
// 設置服務端的URL,客戶端請求中使用
HttpUrl baseUrl = server.url("/v1/chat");
// 運行你的應用程序代碼,進行HTTP請求
// 響應會按照上面設置中放入隊列的順序被返回
Chat chat = new Chat(baseUrl);
chat.loadMore();
assertEquals("hello, world!", chat.message());
chat.loadMore();
chat.loadMore();
assertEquals(""
+ "hello, world!\n"
+ "sup, bra?\n"
+ "yo dog", chat.message());
// 可選:確認你的應用做出了正確的請求
RecordedRequest request1 = server.takeRequst();
assertEquals("/v1/chat/messages/", request1.getPath());
assertNotNull(request1.getHeader("Authorization"));
RecordedRequest request2 = server.takeRequest();
assertEquals("/v1/chat/message/2", request.getPath());
RecordedRequest request3 = server.takeRequest();
assertEquals("/v1/chat/message/3", request.getPath());
// 關閉服務,因為不能重用
server.shutdown();
}
單元測試時候,可以把 server 作為一個字段,然后在 tearDown() 方法中關閉服務。
Api接口
模擬Response(MockResponse)
MockResponse 可以默認返回http code是200的response,相依可以設置字符串、輸入流、字節數組,設置可以設置Header。
MockResponse response = new MockResponse()
.addHeader("Content-Type", "application/json,charset=utf-8")
.addHeader("Cache-Control", "no-cache")
.setBody("{}");
MockResponse還可以模擬低速率網絡的情況。這一點在測試超時和交互式測試時非常有用。
response.throttleBody(1024, 1, TimeUnit.SECONDS);
記錄請求(RecordedRequest)
校驗請求的請求方法、路徑、HTTP版本、請求體、請求頭。
RecordedRequest request = server.takeRequest();
assertEquals("POST /v1/chat/send HTTP/1.1", request.getRequestLine());
assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type"));
assertEquals("{}", request.getUtf8Body());
轉發器(Dispatcher)
默認情況下 MockWebServer 使用隊列來指定響應。另外,可以根據需要使用另外一種響應策略,可以通過轉發器來處理器,可以通過請求的路徑來選擇轉發策略。比如,我們可以過濾請求替代 server.enqueue()。
final Dispatcher dispatcher = new Dispatcher() {
@Override
public MockResponse dispatch(RecordedRequest request) throws InterruptedException {
if (request.getPath().equals("/v1/login/auth/")){
return new MockResponse().setResponseCode(200);
} else if (request.getPath().equals("v1/check/version/")){
return new MockResponse().setResponseCode(200).setBody("version=9");
} else if (request.getPath().equals("/v1/profile/info")) {
return new MockResponse().setResponseCode(200).setBody("{\\\"info\\\":{\\\"name\":\"Lucas Albuquerque\",\"age\":\"21\",\"gender\":\"male\"}}");
}
return new MockResponse().setResponseCode(404);
}
};
server.setDispatcher(dispatcher);
集成
Gradle
testCompile 'com.squareup.okhttp3:mock
webserver:(insert latest version)'
Maven
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>mockwebserver</artifactId>
<version>(insert latest version)</version>
<scope>test</scope>
</dependency>
原文轉自:http://www.jianshu.com/p/7dc3d12ac67f