1概述

Mickito模拟器是主流的单元测试框架之一,它需要与Junit测试框架一起使用.

2.相关概念

2.1存根类(Stub)

存根(Stub)类是实现了一个接口或者抽象类的类,可以在测试过程中可以使用该类对象调用该类的方法进行测试.存根类的对象需要手动创建.如:

Private PingAnEnterService pingAnEnterService = new PingAnEnterServiceImpl();

2.2模拟对象 (Mock)

模拟对象(mock object)是一个接口或者类的虚拟实现.可以使用mock(T.class)方法或使用@Mock注解生成模拟对象.如:

//模拟创建一个List对象

List mock = mock(List.class);

@Mock

private List<String,Object> list;

存根和模拟对象都可以传递给其他的对象进行测试。你的一些单元测试可以测这些类的正确性等。利用存根对象或者模拟对象可以保证测试过程中不受到其他的影响

3.对应的注解

3.1 @Mock

生成一个模拟对象.与方法mock(T  t)作用一样.有个name属性,可以设置对象的别名.

3.2 @InjectMocks

创建一个实例,其余用@Mock(或@Spy)注解创建的mock将被注入到用该实例中.

注意:必须使用@RunWith(MockitoJUnitRunner.class) 或 Mockito.initMocks(this)进行mocks的初始化和注入。如下:

方式一:

@RunWith(MockitoJUnitRunner.class)

public class Test{

@InjectMocks  //创建someHandler实例

private SomeHandler someHandler;

@Mock

private OneDependency oneDependency; // 此mock将被注入到someHandler

}

方式二:

public class Test{

@InjectMocks

//创建someHandler实例. SomeHandler是类

//private SomeHandler someHandler;

//创建someHandler实例. SomeHandler是接口

private SomeHandler someHandler = new SomeHandlerImpl();

@Mock

private OneDependency oneDependency; // 此mock将被注入到someHandler

@Before

public void before(){

MockitoAnnotations.initMocks(this);

//给模拟对象属性赋值

when(oneDependency.setOpenId).thenReturn(“mlsama”);

. . .

}

}

4.Mockito的限制

以下的类型不能进行构造:

终态类(final classes)

匿名类(anonymous classes)

基本数据类型(primitive types)

5.模拟对象的配置

其实就是对使用@Mock或mock(T  t)创建的模拟对象方法设置返回值(通过set方法完成成员变量赋值).

5.1方式一

设置返回值:

when(mock.method()).thenReturn(value)

设置返回异常:

when(mock.method()).thenThrow(new XXXException())

迭代风格: 第一次调用返回,第二次返回

when(mock.method()).thenReturn("Hello").thenReturn("World")

例如:

@Test

public void mock1(){

//模拟创建一个List对象

List mock = mock(List.class);

//这里也可以: thenReturn (new RuntimeException());

when(mock.get(1)).thenReturn(1);

when(mock.get(1)).thenThrow(newRuntimeException());

System.out.println(mock.get(1));//抛异常

}

需要注意的是: when(T  t),所以里面的方法的返回值不能是void

5.2方式二

设置返回值:

doReturn(value).when(mock) .method()

设置返回异常:

doThrow(new XXXException()).when(mock) .method()

例如:

@Test

public void mock1(){

//模拟创建一个List对象

List mock =mock(List.class);

doReturn(1), when(mock) .get(1);

doThrow(new RuntimeException()).when(mock) .get(1);

System.out.println(mock.get(1));//抛异常

}

注意:以上方式不支持返回值为void的方法.

5.3对void方法进行方法预期设定

doNothing() 模拟不做任何返回(mock对象void方法的默认返回) 
doNothing().when(mock).remove(); 
doThrow(Throwable) 模拟返回异常 
doThrow(new RuntimeException()).when(mock).remove();

6.验证模拟对象的行为

Mockito 跟踪了所有的方法调用和参数的调用情况。verify()可以验证方法的行为。

格式:

verify(模拟对象).模拟对象的方法( 参数列表 )

查看下面的例子:

@Test

public void testMap() {

Map mock =Mockito.mock( Map.class );

Mockito.when(mock.get( "city" ) ).thenReturn( "深圳" );

// test code

assertEquals("城市测试", "深圳", mock.get( "city" ) );

Mockito.verify(mock).get( Matchers.eq( "city" ) );

Mockito.verify(mock, Mockito.times( 2 ) );

}

7. Spy

@Spy 或者方法 spy() 可以包含一个真实的对象. 每次调用,除非特出指定,否则委托给该真实对象的调用.

@Test

public void testSpy() {

// Lets mock aLinkedList

List list = new LinkedList();

list.add("yes" );

List spy =Mockito.spy(list);

//You have to usedoReturn() for stubbing

assertEquals("yes", spy.get( 0 ) );

Mockito.doReturn("foo").when(spy).get(0);

assertEquals("foo", spy.get( 0 ) );

}

Mockito模拟器相关推荐

  1. Mockito一个用于Java开发的伟大的模拟框架

    原文地址:https://www.codeproject.com/articles/516360/mockito-a-great-mock-framework-for-java-developmen ...

  2. 单元测试及框架简介 --junit、jmock、mockito、powermock的简单使用

    转 单元测试及框架简介 --junit.jmock.mockito.powermock的简单使用 2013年08月28日 14:33:06 luvinahlc 阅读数:6413 标签: 测试工具 单元 ...

  3. 7种方法检测安卓模拟器_两种不同的模拟方法

    7种方法检测安卓模拟器 无论您选择采用TDD还是采用更传统的方法,都将单独测试类. 这通常意味着您使用接口进行编码,并将依赖项注入类中. 去年,我不得不测试一个servlet. Servlet是展示容 ...

  4. cmodel模拟器开发

    cmodel模拟器开发 对于一个公司来说,产品的设计周期就是生命线,一般来说都会在设计功能级仿真的c-model后直接转向RTL设计. 在目前的技术下,做cycle-by-cycle的设计和直接RTL ...

  5. Android模拟器学framework和driver之传感器篇1(linux sensor driver)

    对于android模拟器开发环境的搭建这里我就不多说了,网上google下一大堆,还有就是android 模拟器的kernel使用的是goldfish的kernel,可以使用git得到源码,然后就可以 ...

  6. 模拟器不全屏_iOS 14实测GBA游戏模拟器下载

    玩捷径 - 带你玩转iPhone捷径 hello大家好,我是小唐.因公众号目前的推送机制已改变,可能有时候会看不到小唐新写的作文. 建议大家点击公众号资料页面右上角「...」,把公众号设为星标(置顶) ...

  7. 华为鸿蒙运行视频,某游戏在华为鸿蒙运行,被识别成使用安卓模拟器

    IT 之家 5 月 14 日消息 华为在 2019 年开发者大会上正式推出了鸿蒙 OS 系统,并首先应用在智慧屏等产品上,并于 2020 年开发者大会上宣布为智能手机升级支持鸿蒙 HarmonyOS ...

  8. 开源游戏机java模拟器_最棒的 7 款开源终端模拟器

    你是系统管理员,Linux 重度用户,或者只是每天要在命令行花费大量时间的用户?选择哪种终端仿真程序,可能跟个人的喜好有关.你是喜欢轻量级呢,还是探索全部功能和可定制化的选项?或者只使用发行版给的默认 ...

  9. Udacity机器人软件工程师课程笔记(二十五) - 使用PID控制四轴飞行器 - 四轴飞行器(四旋翼)模拟器

    1.四轴飞行器运动学和动力学模型 在讨论四轴飞行器时,明确定义两个参考坐标系会很有帮助:一个固定的世界坐标系W{W}W和一个牢固地附着到四轴飞行器的质心(CoM)的运动坐标系B{B}B. 假设运动坐标 ...

最新文章

  1. Ian Thiel:靠这 3 点,实现 30 倍增长,从不盈利到营收 5.5 亿
  2. django的from组件
  3. java map 实现 序列化,MapReduce序列化
  4. 科大奥锐实验报告霍尔效应_大学物理实验报告系列之霍尔效应
  5. python在材料方面的应用_python记录材料题带标准答案
  6. mysql 案例~ 主从复制转化为级联复制
  7. WEB-INF 目录下的文件无法直接浏览器访问
  8. iptables原理知识
  9. C#基础7:类的定义
  10. 聚焦四个重组,构建基于IPD的卓越研发体系(3.0版)
  11. 西门子PLC S7-200 SMART简介
  12. 高性能MySQL(第3版) 中文PDF带目录清晰版
  13. 南航率先启用“手机登机”
  14. PageRank实践-博客园用户PageRank排名
  15. Navicat导出整个数据库(可以直接迁移,不会因为外键关系而导致导入不了)
  16. 滴滴渡劫:“先活着再说”
  17. php+fpm+加大request,php-fpm配置 - 小良下山化了个缘的个人空间 - OSCHINA - 中文开源技术交流社区...
  18. 3.1selenium自动化测试基本操作
  19. 数字式声纳设计原理 pdf_低频数字式相位测试仪的原理与使用
  20. 开元硬件平台 Arduino

热门文章

  1. 前世看今生,从JavaEE到微服务
  2. 转换成大写日期(中文)
  3. 端接电阻与阻抗匹配那些事
  4. 幻想传说:全技能奥义、料理、物品、称号、交易品 获得条件(图文)
  5. 计算机科学——图论专题
  6. PX4代码学习系列博客(6)——offboard模式位置控制代码分析(之前转载过,这是第二次转载了)
  7. phpstudy mysql无限重启_phpstudy mysql无限重启 错误日志显示以下内容5.7.26/8.0.12
  8. 服务器安装frps实现内网穿透(3)-服务端nginx和frps共用80/443端口
  9. IT资源汇总全分享,学习资料免费领取处
  10. 《体育画报》直接推出虚拟现实泳装特辑,赚尽眼球