繁体   English   中英

Mockito.any返回null

[英]Mockito.any returns null

我试图用这样的参数模拟一个静态方法:

Mockito.when(StaticClass.staticMethod(Mockito.any(A.class), 
                                      Mockito.any(B.class), SomeEnum.FOO))
       .thenReturn(true);

我添加了以下注释:

@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(Parameterized.class)
@PrepareForTest({StaticClass.class, A.class, B.class})

但是Mockito.any总是返回null 为什么?

首先,您不能将匹配器与实际参数混合使用。 您也应该为SomeEnum参数使用匹配器:

Mockito.when(StaticClass.staticMethod(Mockito.any(A.class), 
                                      Mockito.any(B.class), Mockito.eq(SomeEnum.FOO))
       .thenReturn(true);

其次,any()方法应该返回null。 这正是他们所做的。 如果查看这些方法的代码,如果它是原始包装器对象(如Integer,Boolean等),则返回类类型的默认值,否则返回null:

public <T> T returnFor(Class<T> clazz) {
    return Primitives.isPrimitiveOrWrapper(clazz) ? Primitives.defaultValueForPrimitiveOrWrapper(clazz) : null;
}

你弄错了。 独一无二的匹配方法,例如任何(目的是,以匹配在执行时进来的参数。

您可以使用这些方法来指示模拟框架您希望发生的调用。 或者反过来你用它们说:如果这个或那个作为参数出现,那么就这样做。

因此,您绝对不关心匹配器调用的结果。

从这个意义上说,你的问题表明你对模拟框架的使用是错误的。 因此,我们可以给出关于您当前输入的唯一答案:A)进行更多研究如何使用模拟和B)然后重新设计您的问题以明确您的问题。

简答:使用doReturn().when()而不是when().then()

在这里可以找到很长的答案: Mockito匹配器如何工作?

匹配器返回虚拟值,例如零,空集合或null。 Mockito尝试返回一个安全的,适当的虚拟值,如0表示anyInt()或任何(Integer.class),或者为anyListOf(String.class)返回一个空列表。 但是,由于类型擦除,Mockito缺少类型信息来返回任何值,但null为任何()

NullPointerException或其他异常:调用when(foo.bar(any()))。thenReturn(baz)实际上会调用foo.bar(null),在接收null参数时,您可能已将其存根以引发异常。 切换到doReturn(baz).when(foo).bar(any())跳过存根行为。

附注:此问题也可以描述为如何在对空参数进行前置条件检查的方法上使用Mockito匹配器?

这是因为它是参数化测试,我在@Before方法中做了mockStatic。 当我使用相同的方法执行mockStatic时,它可以工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM