Mockito.any返回null

时间:2017-11-06 14:37:14

标签: java unit-testing testing mockito powermock

我正在尝试使用如下参数模拟静态方法:

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。为什么?

4 个答案:

答案 0 :(得分:3)

首先,您不能将匹配器与实际参数混合使用。您也应该为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;
}

答案 1 :(得分:1)

你弄错了。匹配器方法的唯一目的,例如 any()匹配执行时进入的参数。

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

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

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

答案 2 :(得分:1)

简短答案:使用doReturn().when()代替when().then()

长答案可以在这里找到: How do Mockito matchers work?

  

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

     

NullPointerException或其他异常:调用   when(foo.bar(any()))。thenReturn(baz)实际上会调用foo.bar(null),   您可能已经被存根在收到一个异常时抛出异常   空参数。切换到doReturn(baz).when(foo).bar(any())会跳过   顽固的行为。

侧面注:此问题也可以用类似的方式描述,如何在具有对空参数进行先决条件检查的方法上使用Mockito匹配器?

答案 3 :(得分:0)

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