Mockito 匹配原始类型

Mar*_*lka 8 java mockito

使用 Mockito 设置模拟时出现异常:

java.lang.NullPointerException: Attempt to invoke virtual method 'double java.lang.Double.doubleValue()' on a null object reference
Run Code Online (Sandbox Code Playgroud)

设置代码是这样的:

Mockito
    .when(aMock.method(any(), any()))
    .thenReturn(something);
Run Code Online (Sandbox Code Playgroud)

哪里method需要两个double参数。

Pau*_*ton 10

any()返回null。这个选择是不可避免的,因为签名any()

public static <T> T any()
Run Code Online (Sandbox Code Playgroud)

由于泛型类型在 Java 中被删除,并且由于没有任何内容传递给携带任何类型信息(例如 a Class<T>)的方法,因此null是唯一合理的返回值。

如果模拟的方法具有原始类型的参数,则会产生问题,因为取消装箱此null值会抛出NullPointerException.

有两种可能的解决方案。您可以使用原始版本(例如anyDouble()),也可以使用接受 a 的版本Class(例如any(Double.class))。在后一种情况下,由于我们向方法提供类型信息,因此可以使用此信息返回合理的非空值(例如0.0D,在 double 的情况下)。


Mar*_*lka 8

错误的原因有点人为——any()不能用来代替原始数据类型。

anyChar()anyDouble()必须用于代替原始类型。