天天看点

Mockito教程

https://www.cnblogs.com/Ming8006/p/6297333.html

目录

1 Mockito 介绍 

  1.1 Mockito是什么?

  1.2 为什么需要Mock

  1.3 Stub和Mock异同

  1.4 Mockito资源

  1.5 使用场景

2 使用Mockito 

  2.1 验证行为

  2.2 模拟我们所期望的结果

  2.3 RETURNS_SMART_NULLS和RETURNS_DEEP_STUBS

  2.4 模拟方法体抛出异常

  2.5 使用注解来快速模拟 

  2.6 参数匹配

  2.7 自定义参数匹配

  2.8 捕获参数来进一步断言

  2.9 使用方法预期回调接口生成期望值(Answer结构)

  2.10 修改对未预设的调用返回默认期望

  2.11 用spy监控真实对象  

  2.12 真实的部分mock

  2.13 重置mock

  2.14 验证确切的调用次数

  2.15 连续调用

  2.16 验证执行顺序

  2.17 确保模拟对象上无互动发生

  2.18 找出冗余的互动(即未被验证到的)

3 Mockito如何实现Mock

参考 

 返回

Mockito是mocking框架,它让你用简洁的API做测试。而且Mockito简单易学,它可读性强和验证语法简洁。

测试驱动的开发( TDD)要求我们先写单元测试,再写实现代码。在写单元测试的过程中,我们往往会遇到要测试的类有很多依赖,这些依赖的类/对象/资源又有别的依赖,从而形成一个大的依赖树,要在单元测试的环境中完整地构建这样的依赖,是一件很困难的事情。如下图所示: 

Mockito教程

为了测试类A,我们需要Mock B类和C类(用虚拟对象来代替)如下图所示:

Mockito教程

相同:Stub和Mock都是模拟外部依赖

不同:Stub是完全模拟一个外部依赖, 而Mock还可以用来判断测试通过还是失败 

官网: http://mockito.org

API文档:http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html

项目源码:https://github.com/mockito/mockito 

提前创建测试; TDD(测试驱动开发)

团队可以并行工作

你可以创建一个验证或者演示程序

为无法访问的资源编写测试

Mock 可以交给用户

隔离系统  

添加maven依赖

添加junit依赖

添加引用

Mockito教程
Mockito教程
Mockito教程
Mockito教程
Mockito教程
Mockito教程

RETURNS_SMART_NULLS实现了Answer接口的对象,它是创建mock对象时的一个可选参数,mock(Class,Answer)。

在创建mock对象时,有的方法我们没有进行stubbing,所以调用时会放回Null这样在进行操作是很可能抛出NullPointerException。如果通过RETURNS_SMART_NULLS参数创建的mock对象在没有调用stubbed方法时会返回SmartNull。例如:返回类型是String,会返回"";是int,会返回0;是List,会返回空的List。另外,在控制台窗口中可以看到SmartNull的友好提示。

Mockito教程
Mockito教程

RETURNS_DEEP_STUBS也是创建mock对象时的备选参数

RETURNS_DEEP_STUBS参数程序会自动进行mock所需的对象,方法deepstubsTest和deepstubsTest2是等价的

Mockito教程
Mockito教程

在上面的测试中我们在每个测试方法里都mock了一个List对象,为了避免重复的mock,是测试类更具有可读性,我们可以使用下面的注解方式来快速模拟对象:

OK,我们再用注解的mock对象试试 

运行这个测试类你会发现报错了,mock的对象为NULL,为此我们必须在基类中添加初始化mock的代码

Mockito教程
Mockito教程

或者使用built-in runner:MockitoJUnitRunner

Mockito教程
Mockito教程
Mockito教程
Mockito教程

除了匹配制定参数外,还可以匹配自己想要的任意参数

Mockito教程
Mockito教程

注意:如果你使用了参数匹配,那么所有的参数都必须通过matchers来匹配,如下代码:

Mockito教程
Mockito教程
Mockito教程
Mockito教程

较复杂的参数匹配器会降低代码的可读性,有些地方使用参数捕获器更加合适。

Mockito教程
Mockito教程
Mockito教程
Mockito教程

也可使用匿名内部类实现

Mockito教程
Mockito教程
Mockito教程
Mockito教程

Mock不是真实的对象,它只是用类型的class创建了一个虚拟对象,并可以设置对象行为

Spy是一个真实的对象,但它可以设置对象行为

InjectMocks创建这个类的对象并自动将标记@Mock、@Spy等注解的属性值注入到这个中

Mockito教程
Mockito教程
Mockito教程
Mockito教程
Mockito教程
Mockito教程
Mockito教程
Mockito教程
Mockito教程
Mockito教程
Mockito教程
Mockito教程
Mockito教程
Mockito教程
Mockito教程
Mockito教程

Mockito并不是创建一个真实的对象,而是模拟这个对象,他用简单的when(mock.method(params)).thenRetrun(result)语句设置mock对象的行为,如下语句:

在Mock对象的时候,创建一个proxy对象,保存被调用的方法名(get),以及调用时候传递的参数(0),然后在调用thenReturn方法时再把“first”保存起来,这样,就有了构建一个stub方法所需的所有信息,构建一个stub。当get方法被调用的时候,实际上调用的是之前保存的proxy对象的get方法,返回之前保存的数据。

[1] 单元测试之Stub和Mock

[2] mockito简单教程

[3] Mockito入门

[4] 学习Mockito

分类: 白盒测试,测试框架

继续阅读