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。
看到這想必也明白了所謂的反作用,如果執行裏面的方法時,不免會產生影響,好比拋出異常等。異常

相關文章
相關標籤/搜索