doReturn().when()与when().thenReturn()

在昨天的汇报中,潘老师以为讲的偏离了中心,在讲解了一番了之后,让我从新修改,但我以为那篇文章若要改为这个题目,改动颇大,因此有了这篇文章。code

mock()与spy()

想要使用题目中的方法,必须得是一个mock的对象,而这能够经过上面两种方法生成,先来看看他两的区别:
有一个类A对象

class A {  
  public int  add(int a , int b) {  
        return a + b;  
  }  
}

此时生成两个对象it

A a = new A();
A a1 = Mockito.mock(A.class);
A a2 = mockito.spy(a);

此时,经过mock生成的对象,会拥有之前的对象的全部方法,可是方法中都没有了功能,就好比上面的a1对应的类能够理解下面这样class

A1 extend A {  
    pubic int add(int a, int b) {  
        return null;  
  }  
}

a2是同过调用clone()复制的,正常看来就和一个普通的对象如出一辙,只是他的方法可以进行模拟。mock

两种模拟方法

doReturn().when()是无反作用的。
when().thenReturn()是有反作用的

上面是比较官方的说法,用实际的例子来理解一下,mock

Mockito.when(a2.add(1,2 )).thenReturn(5);

此时上面的方法中,会先执行a + b,即 1 + 2 , 结果本应是3,但因为后面的thenReturn ,因此调用该方法时,实际的返回值是5。
而如果用另外一种方法方法

Mockito.doReturn(5).when(a2).add(1,2);

此时,就不会执行a+b的操做,而会直接返回5。
看到这想必也明白了所谓的反作用,如果执行里面的方法时,不免会产生影响,好比抛出异常等。异常

相关文章
相关标签/搜索