51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 8311|回复: 1
打印 上一主题 下一主题

Mock和Mockito简介

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-4-1 14:26:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
什么是Mock?

在面向对象程序设计中,模拟对象(英语:mock object,也译作模仿对象)是以可控的方式模拟真实对象行为的假的对象。程序员通常创造模拟对象来测试其他对象的行为,很类似汽车设计者使用碰撞测试假人来模拟车辆碰撞中人的动态行为。

为什么要使用Mock?

在单元测试中,模拟对象可以模拟复杂的、真实的(非模拟)对象的行为, 如果真实的对象无法放入单元测试中,使用模拟对象就很有帮助。
在下面的情形,可能需要使用模拟对象来代替真实对象:
- 真实对象的行为是不确定的(例如,当前的时间或当前的温度);
- 真实对象很难搭建起来;
- 真实对象的行为很难触发(例如,网络错误);
- 真实对象速度很慢(例如,一个完整的数据库,在测试之前可能需要初始化);
- 真实的对象是用户界面,或包括用户界面在内;
- 真实的对象使用了回调机制;
- 真实对象可能还不存在;
- 真实对象可能包含不能用作测试(而不是为实际工作)的信息和方法。

例如,一个可能会在特定的时间响铃的闹钟程序可能需要外部世界的当前时间。要测试这一点,测试一直要等到闹铃时间才知道闹钟程序是否正确地响铃。如果使用一个模拟对象替代真实的对象,可以变成提供一个闹铃时间(不管是否实际时间),这样就可以隔离地测试闹钟程序。

摘自:维基百科

Mockito的简单使用

Mockito是GitHub上使用最广泛的Mock框架,并与JUnit结合使用.Mockito框架可以创建和配置mock对象.使用Mockito简化了具有外部依赖的类的测试开发!

一般使用Mockito的步骤:

模拟任何外部依赖并将这些模拟对象插入测试代码中
执行测试中的代码
验证代码是否按照预期执行


配置依赖

如果我们在Java项目中使用的是Gradle编译,应在Gradle的构建文件中添加:
  1. repositories { jcenter() }
  2. dependencies { testCompile "org.mockito:mockito-core:2.+" }
复制代码

特别的,对于Android项目:
  1. dependencies {
  2.     // ... more entries
  3.     testCompile 'junit:junit:4.12'

  4.     // required if you want to use Mockito for unit tests
  5.     testCompile 'org.mockito:mockito-core:2.+'
  6.     // required if you want to use Mockito for Android tests
  7.     androidTestCompile 'org.mockito:mockito-android:2.7.22'
  8. }
复制代码


可以验证我们的交互逻辑
  1. import static org.mockito.Mockito.*;
  2. /**
  3. * Created by zhanglulu on 2018/1/31.
  4. */
  5. public class MyMockitoTest {
  6.     @Test
  7.     public void testMockitoTest() {
  8.         // mock creation
  9.         List mockedList = mock(List.class);

  10.         // using mock object - it does not throw any "unexpected interaction" exception
  11.         //使用模拟对象(而不是真实创建出来的对象那)
  12.         mockedList.add("one");
  13.         mockedList.clear();

  14.         // selective, explicit, highly readable verification
  15.         verify(mockedList).add("one");
  16.         verify(mockedList).clear();
  17.     }
  18. }
复制代码


可以在代码中打桩(stub)
  1. import static org.mockito.Mockito.*;
  2. /**
  3. * Created by zhanglulu on 2018/1/31.
  4. */
  5. public class MyMockitoTest {
  6.     @Test
  7.     public void testMockitoTest() {
  8.         // you can mock concrete classes, not only interfaces
  9.         LinkedList mockedList = mock(LinkedList.class);

  10.         // stubbing appears before the actual execution
  11.         when(mockedList.get(0)).thenReturn("first");

  12.         // the following prints "first"
  13.         System.out.println(mockedList.get(0));

  14.         // the following prints "null" because get(999) was not stubbed
  15.         System.out.println(mockedList.get(999));
  16.     }
  17. }
复制代码


执行结果:
  1. first
  2. null
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

  • TA的每日心情
    郁闷
    2021-2-20 08:55
  • 签到天数: 231 天

    连续签到: 3 天

    [LV.7]测试师长

    2#
    发表于 2020-4-2 17:19:39 | 只看该作者
    代码量少的,要多看看
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-4-26 13:01 , Processed in 0.069911 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表