1. mockito是干什么的?

Mock框架之一,其余的还有EasyMock,PowerMock等。

Mock说白了就是打桩(Stub)或则模拟,当你调用一个不好在测试中创建的对象时,
Mock框架为你模拟一个和真实对象类似的替身来完成相应的行为

就是利用他,我们可以创建一个傀儡,然后被mock的类要返回的数据我们都可以指定
就像下面这样 :

User user = mock(User.class);
when(user.getName(3)).thenReturn("张三");
Log.e(TAG, "name=" + user.getName(3));
assertEquals("张三", user.getName(3));

我们mock了User这个类,要求他当被请求返回名字getName()的时候,就返回张三

很好懂吧?下面说点实际的运用

2. 异步回调测试

我们做异步加载之类的,如发送网络请求等,很多时候都需要回调,在回调接口中返回特定的数据!
如果服务器还没开发好,我们就很被动,无法测试接口,进行下一步的工作!
当然,什么模拟超时服务器崩溃没响应的情况返回特定的临界数据等特殊的要求,
这个要求后台配合都是不容易做的,更何况还要求我们修改一些内容后能够再全部模拟一遍!

但有了这个mockito,这个问题就有了解决方案

假设我们的接口像这样的,调用userApi注册一个叫jack的账号,回调返回注册结果

  mUserApi.register("jack", new Callback<Result>() {@Overridepublic void success(Result result, Response response) {Log.e(tag, "result ="+result);activity.setListAdapter(result);}@Overridepublic void failure(RetrofitError retrofitError) {displayErrorMessage();}
});

好啦,那么我们怎么测试这个接口呢?
我们需要一个东西,叫ArgumentCaptor
关于他,我们后面再说,只需要记住,他人如其名,是参数捕抓能手,可以”保存参数的数据”。

@Captor
private ArgumentCaptor<Callback<Result> cb;
@Mock
UserApi mockUserApi@MediumTest
public void testLifeCycleCreate() {// 我们的待测Activity里面有这么个接口,来让我们设置api,// 这是一种侵入式的方式,没办法,只能要求暴露个接口,或者把量变弄成 public ,protected级别// 要不然无法建立这个测试和我们实际要测的Activity之间的联系。// 不要以为我们在这里弄了个把UserApi设置成mock了的,// 那么整个app里面有用到这个的都会被mock,这只对现在的mockUserApi有效...// 我一开始也是天真的这么觉得的。。。。。getActivity().setUserApi(mockUserApi);Mockito.verify(mockUserApi).register(Mockito.anyString(), cb.capture());List<Result> noRepos = new ArrayList<Repository>();//  给我们的回调函数返回指定内容 !        cb.getValue().success(noRepos, null);assertThat(activity.getListAdapter()).isEmpty();
}

这里有几点需要注意:

  1. Mockito.anyString()
    他可以匹配任何参数数据,因为这个verify是有参数匹配要求的。

  2. cb.capture()
    我们并不是直接人cb,而是函数cb.capture();

  3. @Captor
    这个是需要我们在setup()函数加多这么句,MockitoAnnotations.initMocks(this);
    然后系统就会自动帮我们注入,不用像前面的 User user = mock(User.class); 需要手动写

然后对应的Actiivty里面

    @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mUserApi.register("jack", mCallbackListener);   }setApi(UserApi userApi){this.mUserApi=userApi;}

那么问题来了,如果我们要求实匹配特定的请求的呢,例如就判断jack的注册?
这里就有小插曲要说啦,一般我们mock是这么写的:

when(mockUserApi).register("jack", callback) ;

但如果这么写,就会有bug

org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
Invalid use of argument matchers!
2 matchers expected, 0 recorded: This exception may occur if matchers are combined with raw values:
//incorrect:
someMethod(anyObject(), "raw String");
When using matchers, all arguments have to be provided by matchers.
For example:
//correct:
someMethod(anyObject(), eq("String by matcher"));For more info see javadoc for Matchers class.

这是我见过最好的错误信息之一,简单易懂!!!!!
另外好的就是当年大学用Actel做硬件开发的时候,他们也都有这样的示范答案在旁边的!!
根据信息,我们需要修改成这样 ,加多eq(),同时把我们的回调改成cb.capture();

when(mockUserApi).register(eq("jack"), cb.capture()) ;

同时我们的verify也要修改下

Mockito.verify(mockUserApi).register(eq("jack"), cb.capture());

好啦,基本就是这些!!
有了这个mockito,以后我们测试一些特殊的情况,例如超时,服务器崩溃了,一些特殊的值等就可以自动搞了!不再需要要求后台配合了。

铺垫

说到这里,你可能觉得可以了,但是有一些问题我们其实没测试到的,
那就我们的接口背后可能还做了很多内容,调用了很多别的接口,例如对返回的数据用gson做了解析,不想我们这样是直接返回的,或者在不同的情况下,调用了一些如Gzip来压缩数据等,才返回了这个接口的数据

虽然我们也可以针对各个接口写出测试,但这个成本显然是不低的!!

所以我们期望的是,能够“模拟一个服务器”来响应我们的请求。
这个就需要到别的工具啦,这个就是MockServer

MockServer是一个能够模仿任何通过HTTP连接的服务器或服务,如REST 或 RPC service。提供Java和JavaScript两种API。

关于这个进一步介绍,请保持关注!下次写.


当然你可能允许的时候会遇到一些bug
可以看下这篇配置文章!
Android测试教程9–聊聊配置测试环境的一些问题


来源:

Reliable API testing for Android with Retrofit and Mockito

Mockito – @Mock, @Spy, @Captor and @InjectMocks

Android测试教程11--Mock之mockito,异步测试相关推荐

  1. Android单元测试系列(3)-Mock之Mockito

    目录 一.官网 二.Demo示例 1. 目录结构 2. 被测试的类 3. 测试类 三.Mockito方法说明 1. mock对象创建 2. Mockito框架中的常见方法说明 2.1 常见的打桩方法 ...

  2. iOS 单元测试和UI测试教程

    原文:iOS Unit Testing and UI Testing Tutorial 作者:Audrey Tam 译者:kmyhy 编写测试不是为了追求刺激,测试是为了避免你崭新的 App 变成了充 ...

  3. 搭建渗透测试环境选自KaliLinux无线网络渗透测试教程

    第1章搭建渗透测试环境 许多提供安全服务的机构会使用一些术语,如安全审计.网络或风险评估.以及渗透测试.这些术语在含义上有一些重叠,从定义上来看,审计是对系统或应用的量化的技术评估.安全评估意为对风险 ...

  4. android mock测试资源,Android测试教程 Mock之mockito,异步测试

    1. mockito是干什么的? Mock框架之一,其余的还有EasyMock,PowerMock等. Mock说白了就是打桩(Stub)或则模拟,当你调用一个不好在测试中创建的对象时,  Mock框 ...

  5. Android 测试教程

    Android 测试教程:http://wiki.jikexueyuan.com/project/android-test-course/ 每个开发者都应该懂一点单元测试 一.什么是单元测试? 为了测 ...

  6. android服务器接口测试,使用Retrofit和Mockito进行可靠的Android API测试

    测试与API交互的HTTP调用是一件令人生厌的复杂事情.测试一个真实的Web服务器时,一大堆问题随之产生:脆性测试(brittle test,因为网络或API本身的问题而导致的测试失败).速度减慢测试 ...

  7. Mockito教程:使用Mockito进行测试和模拟

    课程大纲 Mockito是根据MIT许可证发布的Java开源测试框架,该框架允许在自动化单元测试中创建测试双重对象(模拟对象),以实现测试驱动开发(TDD)或行为驱动开发(BDD)的目的. 如官方文档 ...

  8. Mock 及 Mockito 教程

    Mockito 教程 Mockito框架官方地址mockito,文档地址,中文版文档. Mockito库能够Mock对象.验证结果以及打桩(stubbing). 1. Mock和Mockito的关系 ...

  9. 基于Android设备的Kali Linux渗透测试教程第1章渗透测试

    基于Android设备的Kali Linux渗透测试教程第1章渗透测试 渗透测试(Penetration Testing)是一种通过模拟攻击者所采用的技术与方法,攻击目标系统的安全控制措施,并取得访问 ...

最新文章

  1. Java项目:个人博客系统(前后端分离+java+vue+Springboot+ssm+mysql+maven+redis)
  2. 【阿里云课程】详解深度学习优化:参数初始化,激活函数,标准化,池化
  3. greta一些简单实用的字符串匹配
  4. 《从零开始学ASP.NET CORE MVC》:ASP.NET Core 中的 Main方法(5)
  5. 字符串去重_文件数据去重示例
  6. 亚马逊无人商店因拒收现金被美国多地禁止:被认定歧视消费者
  7. hua ge ju hao
  8. Linux命令(1)—— xargs 命令
  9. Cesium:解决画线不光滑,模糊不清,锯齿状
  10. 数学_最小二乘问题的求解
  11. 捷达vs7测试_没有大众车标的光环,捷达VS7显得更厚道,看看是不是你的菜
  12. YOLOV5学习记录
  13. 【Blender 入门系列】 02 乐高方块渲染
  14. php页眉,如何在php中创建Word文档页眉/页脚
  15. 数据库系统之ANSI SQL中的事务处理
  16. 理解浏览器的历史记录
  17. n-gram代码实现源码
  18. topo排序判环实操
  19. 服务器重启后jar包自动重启
  20. 如何找到微信的服务器地址

热门文章

  1. 深信服防火墙web界面卡顿,提示加载页面出错,处理过程。
  2. codeup 吃糖果(C++)
  3. 快速上手JSON数据传递异常处理
  4. 教师资格面试:试讲和说课的区别
  5. 三相异步电动的工作过程
  6. Github 加载不出来,解决方法
  7. sed awk 样例
  8. 【Figma】旋转插件 Rotate Copies 使用方法
  9. [nginx] X-Cache: HIT的意思
  10. 实训日志(九)——抠绿