【问题标题】:Matchers.any() for null value in MockitoMatchers.any() 用于 Mockito 中的空值
【发布时间】:2023-03-06 15:12:02
【问题描述】:

假设我有这个对象objectDemo,它使用两个参数Stringnull 调用方法objectDemoMethod。现在我想用 Mockito 验证这个方法是否被调用:

objectDemo.objectDemoMethod("SAMPLE_STRING", null);

我写了这个:

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

但它给出了一个错误:

对空值无效地使用参数匹配器。

还有其他方法可以传递null 值吗?

【问题讨论】:

  • 快速旁注:Mockito.times(1)verify 的默认值,可以省略。

标签: java mockito


【解决方案1】:

您收到的错误消息是预期的,因为您只对一个参数使用参数匹配器,而不是另一个。来自MatchersJavadoc:

如果您使用参数匹配器,所有参数必须由匹配器提供。

因此,解决方法是对方法的第二个参数也使用匹配器。在这种情况下,它将是匹配 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(clazz)

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

对于 Java ≤ 7 或 Mockito 1 的情况,示例使用第二个参数类型为 String 的情况:需要将其替换为方法参数的实际类型。

【讨论】:

  • 更新,我们可以使用 nullable(String.class) 作为 isNull(String.class) 被认为现在已弃用
【解决方案2】:

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));

【讨论】:

  • 明确地说,只有 isNull(Class) 已弃用。 isNull() 仍然存在,并且不会很快消失(至少在撰写本文时)。
【解决方案3】:

只需使用:

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

以上帮助我在 java 8 版本。希望这会对你有所帮助。

【讨论】:

    【解决方案4】:

    您可以使用 Mockito 的 ArgumentMatchers 类,如下所示:

    Mockito.verify(objectDemo).objectDemoMethod(ArgumentMatchers.any(String.class), ArgumentMatchers.isNull());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多