MockWebServer淺談

發表于:2016-07-28來源:推酷作者:流水不腐小夏點擊數: 標簽:MockWebServe
按照官方文檔定義,MockWebServer是一個可腳本化的用于測試HTTP客戶端的Web服務器。
簡介
MockWebServer Github地址
 
按照官方文檔定義,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:mockwebserver:(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

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97