2015-12-12 72 views
1
public class VerifyClass { 

    public VerifyClass() { 
     System.out.println("Verify Class constructor called"); 
    } 

    public int getSum(int a,int b){ 
     System.out.println("get sum called"); 
     return a+b; 
    } 

} 

上述類的getSum()方法是通過spy()測試。以下是如何使用間諜。間諜的Mockito不列入調用真實對象

@Test 
public void testSpy(){ 
    VerifyClass ob=new VerifyClass(); 
    VerifyClass spy=Mockito.spy(ob); 
    Mockito.when(spy.getSum(1,2)).thenReturn(4); 
    System.out.println("after when :" + spy.getSum(1,2)); 
    assertEquals(4, spy.getSum(1,2)); 
} 

assertEquals通過。據我所知,間諜應該調用真正的對象的方法。在這種情況下,getSum()應該返回3和控制檯顯示

Verify Class constructor called 
get sum called 
after when :4 

相反,它返回它在thenReturn(4)分配4。請澄清一下嗎?

回答

3

對對象進行間諜活動意味着真正的方法正在調用,除非它被截斷。引用Mockito Javadoc(強調我的):

您可以創建真實對象的間諜。當你使用間諜,那麼真正的方法被稱爲(,除非一個方法被剔除)。

因爲在這種情況下會磕碰getSum(做Mockito.when(spy.getSum(1,2))),真正的方法是沒有得到所謂的;存根是。

作爲一個側面說明,真正的getSum實際上是在您編寫Mockito.when(spy.getSum(1,2))時調用的,這就是爲什麼您的日誌顯示爲get sum called。如果你不希望發生這種情況,你可以使用

doReturn(4).when(spy).getSum(1, 2);