最近楼主在做一个sdk,和后台进行协同开发,依赖于后台实现的接口,在开发之前先和后台约定好了接口,然后在开发的过程中可以先mock这个接口,这样就不会阻塞开发的流程.等后台开发好了之后,再一起联调就可以了.
1.引入
implementation 'org.mockito:mockito-core:1.10.19'
implementation 'com.crittercism.dexmaker:dexmaker:1.4'
implementation "com.crittercism.dexmaker:dexmaker-dx:1.4"
implementation 'com.crittercism.dexmaker:dexmaker-mockito:1.4'
2.初始化
在使用过程中,如果遇到“dexmaker.dexcache”相关的异常,如下所示
java.lang.IllegalArgumentException:
dexcache == null (and no default could be found;
consider setting the 'dexmaker.dexcache' system property)
at com.google.dexmaker.DexMaker.generateAndLoad(DexMaker.java:359)
at com.google.dexmaker.stock.ProxyBuilder.buildProxyClass(ProxyBuilder.java:252)
at com.google.dexmaker.mockito.DexmakerMockMaker.createMock(DexmakerMockMaker.java:54)
at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:26)
则可以使用下面的代码先进行初始化
System.setProperty("dexmaker.dexcache", context.getFilesDir().getAbsolutePath());
3.开始mock
例如,定义一个如下的接口,需要和服务器进行交互
public interface ServerApi {
public void check(CheckCallBack callBack);
public int get(String arg);
public void report(String msg);
}
我们可以直接通过以下方式mock出一个对象
ServerApi serverApi = mock(ServerApi.class);
也可以mock一个实现类来得到一个mock对象,这样做的好处是,例如ServerApi有3个接口,实现类已经实现了2个接口的功能,这样我mock出来的对象,我就只需要再定义另外一个接口的行为就可以了.
ServerApi ss = new ServerImpl();
ServerApi serverApi = spy(ss);
mock有返回值的方法,如下所示,mock完了之后,调用serverApi.get(“test”)将会返回10.
when(serverApi.get(any(String.class))).thenReturn(10);
mock无返回值的方法,如下所示,调用serverApi.report(“test”)将不会做任何操作.
doNothing().when(serverApi).report(any(String.class));
mock无返回值,有回调的方法,如下所示,其中answer方法里面通过invocation.getArguments()拿到check方法的参数,然后执行这个回调方法.这样当我们执行serverApi.check(checkCallBack)方法时,就会在checkCallBack的回调方法onResult里面收到我们定义的"mock Result".
doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
CheckCallBack callBack = (CheckCallBack) invocation.getArguments()[0];
String result = "mock Result";
callBack.onResult(true, result);
return null;
}
}).when(serverApi).check(any(CheckCallBack.class));
以上就是mock的一些基础使用,但是应该能够满足我们大部分的使用场景了.