Eko*_*Eko 8 java testing unit-testing mockito powermock
我正在尝试使用以下参数模拟静态方法:
Mockito.when(StaticClass.staticMethod(Mockito.any(A.class),
Mockito.any(B.class), SomeEnum.FOO))
.thenReturn(true);
Run Code Online (Sandbox Code Playgroud)
我添加了以下注释:
@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(Parameterized.class)
@PrepareForTest({StaticClass.class, A.class, B.class})
Run Code Online (Sandbox Code Playgroud)
但是 Mockito.any 总是返回null。为什么 ?
小智 11
简短回答:使用doReturn().when()代替when().then()
在这里可以找到很长的答案: Mockito 匹配器如何工作?
匹配器返回虚拟值,例如零、空集合或 null。Mockito 尝试返回一个安全、适当的虚拟值,例如 anyInt() 或 any(Integer.class) 的 0 或 anyListOf(String.class) 的空列表。然而,由于类型擦除,Mockito 缺乏类型信息来返回任何值,但 any() 返回 null
NullPointerException 或其他异常:调用 when(foo.bar(any())).thenReturn(baz) 实际上会调用 foo.bar(null),当接收到空参数时,您可能已经存根以抛出异常。切换到 doReturn(baz).when(foo).bar(any()) 会跳过存根行为。
旁注:这个问题也可以这样描述,如何在对空参数进行前提条件检查的方法上使用 Mockito 匹配器?
首先,您不能将匹配器与实际参数混合使用。您也应该为 SomeEnum 参数使用匹配器:
Mockito.when(StaticClass.staticMethod(Mockito.any(A.class),
Mockito.any(B.class), Mockito.eq(SomeEnum.FOO))
.thenReturn(true);
Run Code Online (Sandbox Code Playgroud)
其次, any() 方法应该返回 null。这正是他们所做的。如果您查看这些方法的代码,如果它是原始包装对象(如 Integer、Boolean 等),它们将返回类类型的默认值,否则返回 null:
public <T> T returnFor(Class<T> clazz) {
return Primitives.isPrimitiveOrWrapper(clazz) ? Primitives.defaultValueForPrimitiveOrWrapper(clazz) : null;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10417 次 |
| 最近记录: |