2013-02-04 160 views
2

我正在嘗試驗證的方法被調用,我嘲笑的對象上:驗證的Mockito方法無法檢測方法調用

public class MyClass{ 
    public String someMethod(int arg){ 
     otherMethod(); 
     return ""; 
    } 

    public void otherMethod(){ } 
}  

public void testSomething(){ 
    MyClass myClass = Mockito.mock(MyClass.class); 

    Mockito.when(myClass.someMethod(0)).thenReturn("test"); 

    assertEquals("test", myClass.someMethod(0)); 

    Mockito.verify(myClass).otherMethod(); // This would fail 
} 

這不是我的確切的代碼,但它模擬了我正在努力。當試圖驗證otherMethod()被調用時,代碼將失敗。它是否正確?我的verify方法的理解是,它會自動偵測被稱爲存根方法(someMethod

我希望我的問題和代碼是明確

回答

3

不,的Mockito模仿只會返回null上所有調用的任何方法,除非你用例如重寫。 thenReturn()

什麼你要找的是一個@Spy,例如:

MyClass mc = new MyClass(); 
MyClass mySpy = Mockito.spy(mc); 
... 
mySpy.someMethod(0); 
Mockito.verify(mySpy).otherMethod(); // This should work, unless you .thenReturn() someMethod! 

如果你的問題是someMethod()包含您不想執行的代碼,而是嘲笑,然後注入模擬,而不是嘲笑方法調用本身,例如:

OtherClass otherClass; // whose methods all throw exceptions in test environment. 

public String someMethod(int arg){ 
    otherClass.methodWeWantMocked(); 
    otherMethod(); 
    return ""; 
} 

從而

MyClass mc = new MyClass(); 
OtherClass oc = Mockito.mock(OtherClass.class); 
mc.setOtherClass(oc); 
Mockito.when(oc.methodWeWantMocked()).thenReturn("dummy"); 

我希望這是有道理的,並幫助你一點。

乾杯,

+0

感謝這個,但如果我想使用'.thenReturn()''上someMethod'以及驗證'otherMethod'被調用呢? 此外,不這樣則嘲諷類時呈現'verify'沒用? – Ryan

+2

@Ryan:嘲笑一個對象意味着:我不在乎你在現實中做了什麼。做我告訴你要做的。所以'someMethod()'的實現被替換爲'return「test」;'(如果調用0作爲參數)。您通常會模擬依賴項,即被測試類所使用的對象,而不是模擬被測試的類本身。然後你可以驗證被測試的類已經調用了依賴關係。 –

+1

間諜和模擬是兩回事,你應該首先明白!它們的行爲不同,在單元測試方面使用方式不同。如果問題是,裏面有'代碼的someMethod()',你不想被調用,那麼您應該嘲笑的代碼,而不是嘲諷'的someMethod()'調用。 –

相關問題