3

在昨天的汇报中,潘老师觉得讲的偏离了中心,在讲解了一番了以后,让我重新修改,但我觉得那篇文章若要改成这个题目,改动颇大,所以有了这篇文章。

mock()与spy()

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

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

此时生成两个对象

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

此时,通过mock生成的对象,会拥有以前的对象的所有方法,但是方法中都没有了功能,就比如上面的a1对应的类可以理解下面这样

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

a2是同过调用clone()复制的,正常看来就和一个普通的对象一模一样,只是他的方法能够进行模拟。

两种模拟方法

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

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

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。
看到这想必也明白了所谓的副作用,若是执行里面的方法时,难免会产生影响,比如抛出异常等。


笙歌会停
1k 声望45 粉丝

代码成就万世基积沙镇海 梦想永在凌云意意气风发