[英]Matchers.any() for null value in Mockito
假設我有這個 object objectDemo
,它使用 2 個參數String
和null
調用方法objectDemoMethod
。 現在我想用 Mockito 驗證調用了這個方法:
objectDemo.objectDemoMethod("SAMPLE_STRING", null);
我寫了這個:
Mockito.verify(objectDemo, Mockito.times(1)).objectDemoMethod(Matchers.any(String.class), null);
但它給出了一個錯誤:
null 值的參數匹配器使用無效。
還有其他方法可以傳遞null
值嗎?
您收到的錯誤消息是預期的,因為您僅將參數匹配器用於一個參數而不是另一個參數。 來自Matchers
Javadoc:
如果您使用參數匹配器,則所有參數都必須由匹配器提供。
因此,修復方法是對方法的第二個參數也使用匹配器。 在這種情況下,它將是一個匹配null
的匹配器。 根據 Mockito 和 Java 的版本,您可以擁有:
從 Mockito 2 開始,您可以使用ArgumentMatchers.isNull()
。 這適用於 Java 8 及更高版本:
verify(objectDemo, times(1)).objectDemoMethod(any(String.class), isNull());
請注意,如果您使用 Java 7 或更早版本運行,則需要顯式轉換才能使其工作,因為這些版本的 Java 中的類型推斷不考慮調用的方法的類型:
verify(objectDemo, times(1)).objectDemoMethod(any(String.class), (String) isNull());
如果您使用的是 Mockito 1,則可以使用 Matchers.isNull Matchers.isNull(clazz)
代替:
verify(objectDemo, times(1)).objectDemoMethod(any(String.class), isNull(String.class));
對於 Java ≤ 7 或 Mockito 1 的情況,示例使用的情況是第二個參數的類型為String
:它需要替換為方法參數的實際類型。
isNull
似乎已被棄用
在 Java 8 中,此方法將在 Mockito 3.0 中刪除。 此方法僅用於通用友好性以避免強制轉換,Java 8 中不再需要此方法。
我認為你可以使用nullable
:
public static <T> T nullable(Class<T> clazz)
你可以使用類似的東西:
verify(objectDemo, times(1)).objectDemoMethod(any(String.class), nullable(String.class));
只需使用:
Mockito.verify(objectDemo, Mockito.times(1)).objectDemoMethod(Matchers.any(String.class), (ClassName) isNull());
以上在java 8版本中幫助我。 希望這會幫助你。
您可以使用 Mockito 的 ArgumentMatchers 類,如下所示:
Mockito.verify(objectDemo).objectDemoMethod(ArgumentMatchers.any(String.class), ArgumentMatchers.isNull());
使用 Mockito 2.28 和 Mockito Kotlin 2.2 時遇到此問題
any()
和isNull()
不匹配。 但是, eq(null)
最終確實匹配,所以如果您在同一條船上,您可以嘗試一下。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.