Mockito开源测试框架入门介绍

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),请勿用于任何商业用途---

留下评论