使用 Mockito 的通用“any()”方法

新手上路,请多包涵

我有一个接口,它需要一个数组 Foo

 public interface IBar {
  void doStuff(Foo[] arr);
}

我正在使用 Mockito 模拟这个接口,我想断言 doStuff() 被调用,但我不想验证传递了什么参数 - “不在乎”。

如何使用通用方法 any() 而不是 anyObject() 编写以下代码?

 IBar bar = mock(IBar.class);
...
verify(bar).doStuff((Foo[]) anyObject());

原文由 ripper234 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.6k
2 个回答

从 Java 8 开始,您可以使用无参数 any 方法,编译器将推断类型参数:

 verify(bar).doStuff(any());


解释

Java 8 中的新功能是表达式的 目标类型 将用于推断其子表达式的类型参数。在 Java 8 之前,只有用于类型参数推断的方法的参数(大部分时间)。

在这种情况下,参数类型 doStuff 将成为 any() 的目标类型,返回值类型 any() 将被选择以匹配该参数类型。

添加此机制主要是为了能够编译 lambda 表达式,但它总体上改进了类型推断。


原始类型

不幸的是,这不适用于原始类型:

 public interface IBar {
    void doPrimitiveStuff(int i);
}

verify(bar).doPrimitiveStuff(any()); // Compiles but throws NullPointerException
verify(bar).doPrimitiveStuff(anyInt()); // This is what you have to do instead

问题是编译器会将 --- 推断为 --- any() Integer 的返回值类型。 Mockito 不会意识到这一点(由于类型擦除)并返回引用类型的默认值,即 null 。运行时将尝试通过调用 intValue 方法来解开空返回值,然后将其传递给 doStuff ,并引发异常。

原文由 Lii 发布,翻译遵循 CC BY-SA 4.0 许可协议

这应该工作

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.verify;

verify(bar).DoStuff(any(Foo[].class));

原文由 jitter 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏