Mock框架Mockito入门教程

在开发中,我们经常会依赖同事或者第三方提供的接口,如果该接口无法正常工作:比如接口正在修复,或者网络异常等。那么便会对需要依赖该接口的开发造成很大影响。

遇到这种情况,我们可能会想到模拟该接口以提供正常的返回值,用来继续当前的工作。

使用Mockito可以帮助我们面对这个问题。Mockito是进行Mock测试的一个框架,使用一个虚拟的Mock对象来模拟现实中比较复杂的对象。

基本使用如下:

LinkedList mockedList = mock(LinkedList.class);

 //Stubbing 模拟mockList行为
 when(mockedList.get(0)).thenReturn("first");
 when(mockedList.get(1)).thenThrow(new RuntimeException());

通过when函数来指定我们使用mockList对象时所期望的执行结果:

i. 当获取第0个元素时,返回 first;

ii. 当获取第1个元素时,抛出RuntimeException异常。

举个例子:

数据库查询时,ResultSetHandle需要通过Statement接口的实现类来获得数据库查询的结果;如果要实现Statement接口相对来说比较复杂,那么可以使用Mock出一个虚拟的实现来进行ResultSetHandler的测试。

这里创建一个简单的demo来进行演示:

  • 建立一个Statement接口:
public interface Statement {

    String query();
}
  • 再建立一个ResultSetHandler类,其方法handlerResultSets需要一个实现Statement接口的类
public class ResultSetHandler {

    public void handlerResultSets(Statement statement) {
        String queryStr = statement.query ();
        System.out.println (queryStr);
    }
}

  • 建立测试类:使用Mockito创建一个Statement接口的模拟实现类,传入需要调用的方法,可以很方便的对ResultSetHandler进行测试,解除了对Statement实现类的依赖,
public class MockTest {


    public static void main(String[] args) {

        // 使用mock模拟Statement接口行为,这里假设执行查询,返回的结果为test
        Statement imock = Mockito.mock (Statement.class);
        Mockito.when (imock.query ()).thenReturn ("test");

        // 使用spy创建一个真实对象
        ResultSetHandler useMock = Mockito.spy (ResultSetHandler.class);
        useMock.handlerResultSets (imock);
    }
}

小结

本文使用Mockito 模拟一个简单接口,为调用该接口的类提供了一个模拟对象,还有很多高级特性可以参考Mockito官网进行学习

了解更多请关注微信公众号

Mock框架Mockito入门教程