2016-02-19 46 views
2

我有以下的測試方法:的Mockito:通緝,但不調用

MyClass myClass= Mockito.mock(MyClass.class); 
Mockito.when(myClass.methodUsedInMethodBeingTested(Matchers.any(MyTypeParam.class))).thenReturn(Collections.<X, Y> emptyMap()); 

assertNull(myClass.methodToTest(myObject)); 
Mockito.verify(myClass).methodUsedInMethodBeingTested(Matchers.any(MyTypeParam.class)); 

methodUsedInMethodBeingTested是,我想嘲弄,並返回一個空映射的方法。但我收到失敗消息說

Wanted but not invoked myClass.methodUsedInMethodBeingTested()

MyClass 
{ 
    public XYZ methodToTest() 
    { 
    .... 
    .... 
    Map<X,Y> mp = methodUsedInMethodBeingTested(myTypeParam); 
    ..... 
    } 

    public Map<X,Y> methodUsedInMethodBeingTested(MyTypeParam myTypeParam) 
    { 
    ..... 
    } 
} 

回答

7

你誤解了模擬是什麼。當你在做

MyClass myClass = Mockito.mock(MyClass.class); 
// ... 
assertNull(myClass.methodToTest(myObject)); 

你實際上沒有調用methodToTest對你的真實物體。您在模擬上調用methodToTest,默認情況下,它不會執行任何操作並返回null,除非它被截斷。從Mockito docs報價:

By default, for all methods that return value, mock returns null, an empty collection or appropriate primitive/primitive wrapper value (e.g: 0, false, ... for int/Integer, boolean/Boolean, ...).

這說明你後續的錯誤:該方法真的不調用的模擬。


看來你想要的這裏是spy代替:

You can create spies of real objects. When you use the spy then the real methods are called (unless a method was stubbed).

一記警告,雖然:因爲它是越來越稱爲真正的方法,則不應使用Mockito.when但更喜歡Mockito.doReturn(...).when否則該方法將被實際調用一次。如果你考慮表達式:

Mockito.when(myClass.methodUsedInMethodBeingTested(Matchers.any(MyTypeParam.class))).thenReturn(Collections.<X, Y> emptyMap()); 
      ^-----------------------------------^ 
       this will be invoked by Java 

when必須進行評估的方法的參數,但是這意味着該方法methodUsedInMethodBeingTested將被調用。而且由於我們有間諜,這是真正的方法,將被調用。因此,使用:

MyClass spy = Mockito.spy(new MyClass()); 
Mockito.doReturn(Collections.<X, Y> emptyMap()).when(spy).methodUsedInMethodBeingTested(Matchers.any(MyTypeParam.class)); 
assertNull(spy.methodToTest(myObject)); 
Mockito.verify(spy).methodUsedInMethodBeingTested(Matchers.any(MyTypeParam.class)); 
+0

感謝您的回答。我有兩個疑問:1.我無法做到這一點MyClass spy = Mockito.spy(MyClass.class);因爲它說Type mIsmatch無法從類轉換爲MyClass。 2.你能否更好地解釋這個問題「雖然有一個警告:因爲它是真正的方法被調用,所以你不應該使用Mockito.when,而應該選擇Mockito.doReturn(...),否則該方法會被稱爲一次真實:「 – Kode

+0

@Vwin我編輯過。我使用了一種不能在您的Mockito版本中出現的新方法。爲了您的第二個顧慮,我也澄清了。 – Tunaki

+0

這是完美的。有效。感謝@RomanVottner。謝謝Tunaki,你真棒:)而且解釋變得更有意義。 – Kode

1

您正在調用模擬實例上的methodToTest。因爲你還沒有配置它,只是返回null,它不會嘗試調用任何實際的方法的實現。