簡體   English   中英

Matchers.any() 用於 null 中的值 Mockito

[英]Matchers.any() for null value in Mockito

假設我有這個 object objectDemo ,它使用 2 個參數Stringnull調用方法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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM