Mockito是一个Java的开源测试框架,基于MIT License开源协议。
Mockito可以模拟(mock)创建一个接口的实现,或具体类的实现。然后可以像正常的调用对象的方法一样,调用模拟出来的对象的方法,获得预期的结果。同时,也可以验证是否执行过特定的行为。
一旦方法被mock实现之后,无论后续被调用多少次,都将返回被mock时指定的值。
对于同一个方法,使用相同的入参,允许被多次mock,但是生效的总是最后一次mock。
对于所有带返回值的方法,当调用mock对象的这些方法时,不同数据类型的返回值,默认返回值如下:
- 基本类型及其包装类型:返回对应基本类型对应的默认值。例如对于int和Integer类型,返回0。对于boolean和Boolean类型,返回false。
- 集合:返回空集合,而非null;
- 普通对象:返回null。
本篇内容基于Mockito 2.28.2版本,马上开始学习吧。
模拟操作行为,然后进行验证
首先,使用Mockito.mock()方法,传入List接口的class对象,模拟创建一个List类型的mock对象。
然后,对mock出来的对象mockedList,执行add和clear方法。
最后,再通过Mockito.verify()方法,验证mock对象是否调用过指定的方法。
@Test
public void testVerifySomeBehaviour() {
// 使用Mockito.mock()方法创建一个模拟的List对象. 事实上,此处模拟的是List接口
List mockedList = Mockito.mock(List.class);
// 使用mock的对象执行操作
mockedList.add("one");
mockedList.clear();
// 验证已执行过的操作
Mockito.verify(mockedList).add("one"); // 检查是否执行了add("one")
Mockito.verify(mockedList).clear(); // 检查是否执行了clear()
}
注:对于mock出来的对象,对其执行的相关操作,这些操作行为将会被记录起来,并且可以在后续进行验证。
Mockito除了支持mock接口,还支持mock具体的实现类。
模拟返回值,然后进行验证
在实际的项目代码中,通常会有各种各样的方法调用依赖。例如一个方法,依赖于另一个类的某一个方法,或者依赖于数据库,或是外部接口等场景。对于这种情况,一般需要先将整个程序的运行环境配置好,然后等待整个程序启动完成之后,才能够进行测试。而这个过程,对于只想验证某块局部代码,或者想快速验证基本流程是否正确的场景很不友好,反复修改代码和部署的整个过程非常耗时。
我们更加期待的,是在正式部署测试之前,能够在本地先执行基本的单元测试,以验证基本的流程是否正确。而对于方法依赖,只要能够按预期返回就可以了。在基本的流程测试通过之后,再部署到测试环境,连通各个依赖,有针对性的对依赖部分进行测试,这样明显高效很多。
借助于Mockito,可以在进行单元测试的时候,来模拟这些在本地无法简单实现的方法,给它们设置一个预期的返回值,让业务逻辑能够顺利的跑起来。
/**
* mock返回值
*/
@Test
public void testStubbing() {
// 模拟一个具体的类
LinkedList mockedList = Mockito.mock(LinkedList.class);
// 模拟行为. 例如,当执行某个方法时,返回特定的值,或者抛出异常
// 当执行mockedList.get(0)时,返回字符串first;
// 当执行mockedList.get(1)时,抛出RuntimeException异常.
Mockito.when(mockedList.get(0)).thenReturn("first");
Mockito.when(mockedList.get(1)).thenThrow(new RuntimeException());
// 打印first
System.out.println(mockedList.get(0));
// 抛出异常
System.out.println(mockedList.get(1));
}
首先,调用Mockito.when()方法,传入具体的调用行为,即在when参数中”执行某个方法”。
然后,调用when()方法返回对象的then*系列方法,来给方法设置特定的返回值,或者抛出异常。
最后,可以用正常调用对象的方式,来调用方法,获取对应的返回值。
调用mockedList.get(0)
将返回预设的值first,而调用mockedList.get(1)
则会抛出异常。
小结
Mockito支持模拟创建接口或类的实现对象,然后mock一些行为。
一旦mock了对象,就可以对其调用行为进行验证,或者调用相应方法获得预设的返回值。
参考
https://javadoc.io/doc/org.mockito/mockito-core/2.28.2/org/mockito/Mockito.html
---转载本站文章请注明作者和出处 996极客教程(996geek.com),请勿用于任何商业用途---