zoukankan      html  css  js  c++  java
  • 深入理解mockito

    深入理解mockito

    初次使用 Mockito,能够感受到它的神奇,尤其是这样的语法:

    when(mockedList.get(0)).thenReturn("one")
    

    指定当get方法被调用,并且参数为0的时候,返回”one”。
    初次使用Mockito可能会觉得很奇怪,为什么在when()方法里执行一次方法调用,就能够记住被mock方法的信息呢?

    事实上根本不需要在when()方法里边进行stub操作,在任何地方stub都是可以的。例如:

    // 设置mock对象的行为 - 当调用其get方法获取第0个元素时,返回"one"
      String str = mockedList.get(0);
      Mockito.when(str).thenReturn("one");
    

    这样的操作一样可以通过单元测试。事实上我们被这样的固定写法蒙蔽了,我们可以看一下mockito源代码是怎样处理的:

    public <T> OngoingStubbing<T> when(T methodCall) {
            this.mockingProgress.stubbingStarted();
            return (OngoingStubbing)this.stub();
        }
    

    可以看到这个methodCall根本没有用到,它的作用根本不是用来保存方法信息的,它的作用是为了保存方法的返回值类型,使返回值与thenReturn返回的类型一致。

    那么mockito是怎么保存方法的信息呢?如果是一般的写法估计会是这样:

    Mockito.returnValueWhen("one", mockedList, "get", 0);
    第一个参数描述要返回的结果,第二个参数指定mock对象,第三个参数指定mock方法,后面的参数指定mock方法的参数值
    

    但是mockito没有用这么直白的写法,而是使用了动态代理来实现的。这里只说一下思路:当使用Mockito.mock(List.class);生成一个mock对象时,其实是生成一个代理对象。当执行when()stub操作时,就可以利用动态代理记住被mock方法的信息。

    具体代码可参考:https://coding.net/u/tanhe123/p/MockitoSamples

  • 相关阅读:
    JavaScript获取键盘事件
    Java 虚拟机的内存结构
    Java 实现 Http 请求工具类
    HTML5之FileReader文件读取接口
    使用 PLSQL 连接 Oracle9i 数据库
    使用 Navicate 连接 Oracle9i 数据库
    Eclipse 刚检出的项目 Build path 的时候提示 No action available
    Eclipse 中 Debug 调试 java 代码一直报 Source not found
    mongodb 客户端工具
    spring 国际化
  • 原文地址:https://www.cnblogs.com/lanqi/p/8664724.html
Copyright © 2011-2022 走看看