Skip to content

A new way of android mock, return the data defined in interfaces through the android local http server。

License

Notifications You must be signed in to change notification settings

woilsy/android-mock

Folders and files

NameName
Last commit message
Last commit date

Latest commit

790fb79 · Jul 17, 2023
Jul 17, 2023
Mar 28, 2023
Jul 17, 2023
Jun 21, 2023
Apr 29, 2021
May 11, 2021
Apr 21, 2023
Apr 21, 2023
Mar 28, 2023
Jun 21, 2023
Apr 29, 2021
Apr 29, 2021
Mar 28, 2023
May 26, 2021

Repository files navigation

English

介绍

每一次的开发迭代客户端总会依赖后端接口,有时候后端给了接口文档,但开发进度却遥遥无期。而手动去创建一些mock数据或者搭建mock服务器又费时费力,关键是接口好了以后还得重新按照网络请求的形式去获取,本工具就是为了解决这个问题,它有以下特点。

  • 规范请求流程,减少后续调试修改成本。
  • Bean类数据不用多次定义。
  • 可根据需要自行定义字段的固定范围或者数值范围,@MockIntRange、@MockStringRange等。
  • 指定List数据的固定数量,或者最小、最大随机数量,setMockListRandomSize()。
  • 可自定义规则做解析和返回,addRule()。
  • 支持每次请求都生成新的数据,setDynamicAccess()。
  • 支持多种方式的手动Mock数据源进行导入,setDataSource()。
  • 支持不同的解析策略MockStrategy,搭配@MockExclude、@MockInclude更灵活。

Q:如何返回mock数据?
A:Android的网络请求目前以Retrofit为主流,基本上都是REST风格的接口形式存在,它本身是一个网络请求,所以得按照网络请求的方式返回数据,否则正式接入后就无法做到一键切换。那么我们可以在本地自建一个HTTP服务器,AndroidAsync正好符合这个需求,通过集成,可以创建一个本地服务器,并且还可以获取到客户端发起的请求数据,也就可以自行根据一些策略来返回想要的数据了。

Q:如何获取想要的数据?
A:对于Retrofit形式的请求,一般都是在函数的返回值中以Observable<xx>/Call<xxx>/Flow<xx>等形式存在,所以只要解析此返回值的第一个参数,就能获取到想要的返回对象,这就是数据来源,但也不排除Call<ResponseBody>这种形式或者上述没包含的形式的返回。

Q:支持哪些方法?
A:目前支持GET、POST、PUT、DELETE。

Q:Call<ResponseBody>返回如何处理?是否支持协程?
A:ResponseBody由于其本身是无法被静态解析的,能静态解析的都是可序列化的Bean类(List、Map、class) ,所以对于外部,可以通过assets、文件、List<MockData>的形式,将其在配置阶段导入,之后在解析到这个url对应的Method时,会优先判断是否已导入,以导入优先,不会再去解析返回对象。 支持协程函数。

使用说明

加入maven仓库

maven { url 'https://jitpack.io' }

导入依赖

implementation "com.woilsy:android-mock:latest.version"

简单使用

第一步,初始化(可选,已在MockInitProvider中使用默认配置完成了初始化)

Mocker.init(context, options)

参数说明
Context:为了启动服务和解析assets中的文件。
MockOptions:进行mock相关的一些配置:开启日志、设置mock数据返回规则、设置gson处理对象(在mock Date.class的时候,如果DateFormat不一致,会导致解析失败)。

第二步,将MockInterceptor添加到现有okHttpClient的拦截器中

OkHttpClient.Builder.addInterceptor(new MockInterceptor()));

第三步,使用@MockObj标记需要被mock的接口,如示例中的ApiService,还可以指定其MockStrategy。

@MockObj
public interface ApiService {
    ...
}

到此接入完成~

详细说明

1,初始化。
初始化通过MockOptions,设置debug状态,setDebug,可以查看日志。
添加mock规则addRule,包含如DictionaryRule、BaseTypeGenerator,可根据自己需求继承或者拓展。
设置mockList数据最大元素数量,setMockListCount,对于列表类型会随机生成0-最大元素数量的数据。
设置mock数据来源,setDataSource,优先级高于规则,比如将请求地址和返回数据写到assets目录文件中。
设置动态访问,setDynamicAccess,每次是否生成新的数据,如果为false,那么每次同一个地址会返回同样的数据。

2,使用。
通过@MockObj标记被mock的接口后,根据@MockObj中的策略配合请求函数加入@MockInclude或者@MockExclude,示例:

@MockExclude  
@POST("/live/liveRoom/pk/initiate")  
fun invitePk(@Body pkCreateInfo: PkCreateInfo): Observable<BaseRsp<String>>  

这样访问网络时,会自动根据mock规则、mock数据来源等配置返回想要的数据。

3,自定义Mock数据
在Bean类中,还可以添加@Mock、@MockIntRange等注解,传入需要mock的数据,如以下

public class Data{
    @Mock("SECONDS")
    public String timeUnit;
    @Mock("18")
    public int age;
    @Mock("{\"a\":\"1234\"}")
    public ChildA childA;
    @Mock("[]")
    public List<String> ls;
    @MockIntRange({1,2})
    public int type;   
}

@Mock优先级高于默认值,默认值高于自动规则。
@Mock注解可以指定字段具体的mock数据,以及类型,可以为基本类型,也可以为Json数据类型。

更多内容请查看demo和源码。

参与贡献

[email protected]

About

A new way of android mock, return the data defined in interfaces through the android local http server。

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages