我正在尝试使用如下参数模拟静态方法:
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
。为什么?
答案 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时,它可以工作。