原理
基於 OkHttp 的 Interceptor : 如果目標url需要mock,則從本地(assets或sdcard)讀取數據,否則繼續向外發送請求。
使用
首先,在 build.gradle
中添加以下依賴:
compile 'com.shanbay.android:mock-api:0.0.1'
然後,準備mock數據,比如對於請求: /api/user/
我們期望返回:
{
username: "shanbay"
}
我們將上述內容保存爲 user.json
,然後放在assets目錄下的 mockdata/account/
目錄中(這裏的account是suite-name,後面會介紹);
接着,創建Client,增加以下配置:
MockApiSuite suite = new MockApiSuite("account"); // account 表示 suite name
suite.addMockApi(new StandardMockApi(MockHttpMethod.GET, "/api/user/").setSuccessDataFile("user.json"))
MockApiInterceptor mockApiInterceptor = new MockApiInterceptor(context);
mockApiInterceptor.addMockApiSuite(suite);
OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder()
.addInterceptor(mockApiInterceptor) // 注入mock api interceptor
.addInterceptor(new UserAgentInterceptor(context));
....
這時候請求 /api/user/
,你會發現返回了我們剛纔mock的數據 ;-)
更多
MockApiSuite
當我們mock很多api的時候,如果只是簡單聚合這些api,將會非常的凌亂&難以管理,所以我們建立了Suite的概念:把相同業務場景的api放到一個suite中(比如分爲account模塊、purchase模塊),這樣對於之後的更新、維護都非常方便。
StandardMockApi
StandardMockApi用來聲明一個需要mock的api,其中第一個參數表示需要mock的 HTTP Method(支持GET、POST、PUT、DELETE),第二個參數表示需要mock的url (支持正則) ;通過這兩個構造參數,我們基本上就定義出一個mock api的大體框架,之後我們可以通過:
setSuccessDataFile
設置api調用成功返回的數據結果;setErrorDataFile
設置api調用失敗返回的數據結果;setState
設置這次是模擬api調用成功還是失敗(默認模擬調用成功);setRequestTime
設置api請求時間(可以用來模擬請求慢的情況);
Mock數據
- 約定mock數據存放路徑: mockdata/[suite_name]/;
- MockApiInterceptor的第二個構造參數用來指定:mock數據是放在sdcard根目錄,還是assets根目錄(默認);推薦把Mock數據存放在sdcard中,這樣我們可以通過adb命令動態修改mock數據(而不需要重啓App),提高開發效率;