導(dǎo)航
1、retrofit-mock用法
2、retrofit-mock編寫思路(aop)
3 、retrofit-mock的動態(tài)代理及注解
4、aspect 原理講解與注解語法
1、前言
retrofit作為網(wǎng)絡(luò)核心框架,作為基礎(chǔ)庫。
針對retrofit有很多封裝,并不會有很多機(jī)會,穩(wěn)定項目進(jìn)行二次封裝,添加mock代碼,這樣會造成程序的整體不穩(wěn)定,增加測試難度,通常如下:
var api = createMocker(service, retrofit)
所以需要開發(fā)一款無入侵式mock工具,隨時掛載mock和卸載mock的框架
目前retrofit-mock框架功能
1、mock框架無入侵式注入,不需要修改原有網(wǎng)絡(luò)代碼
2、mock框架正式生產(chǎn)包,不會有效率影響
3、支持注解配置,不需要額外代碼,生產(chǎn)代碼與測試代碼一致
4、支持http,本地json,同時兼容適配retrofit2.5.0版本
問題反饋解答:
1、mock庫在debug包生效,release包失效,想使用mock效果,請用debug包
2、寫mock庫目的:生產(chǎn)包和測試包用同一份代碼,不需要額外修改
3、mock在debug生效,release包失效原理:retrofit-mock庫是mock真正實現(xiàn)代碼,retrofit-mock-no-op庫是空實現(xiàn)。如果你希望release包生效,請引用retrofit-mock庫
2、retrofit-mock用法
- 1、用法
/**
* MOCK 有兩種寫法
* mock http地址
* mock 本地json數(shù)據(jù)
*/
public interface Api {
@MOCK(value = "appversion/update.json",enable = true)
@GET(Urls.UPDATE_INTERFACENAME)
Observable<BaseDataBean<IsUpdateBean>> getUpdateInfo();
@MOCK(value = "https://www.baidu.com", enable = false)
@GET(Urls.UPDATE_INTERFACENAME)
Observable<BaseDataBean<IsUpdateBean>> getUpdateInfo2();
}
如上兩種用法
enable 是當(dāng)前接口是否mock的開關(guān)
為了便于易用
//RetrofitMock 是mock的所有接口的總開關(guān)
RetrofitMock.setEnabled( true );
//針對于debugRelease
- 2、retrofit-mock的依賴
dependencies{
debugImplementation 'com.github.yinlingchaoliu:retrofit-mock:1.0.1'
releaseImplementation 'com.github.yinlingchaoliu:retrofit-mock-no-op:1.0.1'
}
//aop開啟
aspectjx {
enabled true
}
allprojects {
repositories {
maven { url 'https://www.jitpack.io' }
}
}
引用aop插件
//引入插件
buildscript {
dependencies {
classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.4'
}
}
添加對應(yīng)依賴
apply plugin: 'android-aspectjx'
增加混淆
####retrofit-mock
-keep class retrofit2.** {*;}
-keep class com.chaoliu.mock.** {*;}
4、特別感謝
首先特別感謝javalong,給retrofit-mock提供了好的思路