2015-09-29 34 views
23

假設我有這個對象objectDemo,它調用2個參數String和null的方法objectDemoMethod。現在我想驗證此方法調用的Mockito:Matchers.any()爲Mockito中的空值

objectDemo.objectDemoMethod("SAMPLE_STRING", null); 

我寫了這個:

Mockito.verify(objectDemo, Mockito.times(1)).objectDemoMethod(Matchers.any(String.class), null); 

,但它給了一個錯誤:

Invalid use of argument matchers for null value.

有沒有另一種方式傳遞null值?

+1

快速注意:'Mockito.times(1)'是'verify'的默認值,可以省略。 –

回答

34

由於您僅爲一個參數使用參數匹配,而不是其他參數匹配,因此您會收到錯誤消息。從Matchers的Javadoc:

If you are using argument matchers, all arguments have to be provided by matchers.

因此,解決方法是使用一個匹配器用於該方法的第二個參數爲好。在這種情況下,它將是匹配null的匹配器。根據和的Mockito的Java版本,你可以有:

  • 與2的Mockito開始,你可以使用ArgumentMatchers.isNull()。這工作與Java 8.0及以上:

    verify(objectDemo, times(1)).objectDemoMethod(any(String.class), isNull()); 
    

    需要注意的是,如果你使用Java 7或以上運行,你需要一個明確的轉換來完成這項工作,因爲在Java的這些版本的類型推斷確實不考慮類型的方法叫做:

    verify(objectDemo, times(1)).objectDemoMethod(any(String.class), (String) isNull()); 
    
  • 如果您使用1的Mockito,你可以使用Matchers.isNull(clazz)來代替:

    verify(objectDemo, times(1)).objectDemoMethod(any(String.class), isNull(String.class)); 
    

對於Java ≤ 7或Mockito 1的情況,這些示例使用第二個參數爲String類型的情況:它將需要替換爲方法參數的實際類型。

+1

只是一個注意Mockito已經棄用'Mockito.isNull(String.class)'它現在應該看起來像'(String)Mockito.isNull()'因此Tunakis示例應該看起來像'verify(objectDemo,times(1))。 objectDemoMethod(any(String.class),String)isNull());' –

+0

@ScottLaHay感謝評論!你說得對,這個答案需要更新,而我剛剛這樣做。 – Tunaki