我想从一个包含 2 个静态方法 m1 和 m2 的类中模拟一个静态方法 m1。我希望方法 m1 返回一个对象。
我尝试了以下
1)
PowerMockito.mockStatic(Static.class, new Answer<Long>() {
@Override
public Long answer(InvocationOnMock invocation) throws Throwable {
return 1000l;
}
});
这会同时调用 m1 和 m2,它们具有不同的返回类型,因此会出现返回类型不匹配错误。
2)PowerMockito.when(Static.m1(param1, param2)).thenReturn(1000l);
但是在执行 m1 时不会调用 this。
3)PowerMockito.mockPartial(Static.class, "m1");
给出了 mockPartial 不可用的编译器错误,这是我从http://code.google.com/p/powermock/wiki/MockitoUsage得到的。
您想要做的是将 1 的一部分和 2 的全部组合起来。
您需要使用 PowerMockito.mockStatic 为类的所有静态方法启用静态模拟。这意味着可以使用 when-thenReturn 语法对它们进行存根。
但是,当您调用未在模拟实例上显式存根的方法时,您正在使用的 mockStatic 的 2 参数重载为 Mockito/PowerMock 应执行的操作提供了默认策略。
从javadoc:
该默认默认磕碰的策略是只返回NULL,0或假的对象,数量和布尔值的方法。通过使用 2-arg 重载,您会说“不,不,不,默认情况下使用此 Answer 子类的答案方法来获取默认值。它返回一个 Long,因此如果您有返回与长,有问题。
相反,使用 1-arg 版本的 mockStatic 来启用静态方法的存根,然后使用 when-thenReturn 指定要为特定方法执行的操作。例如:
字符串值静态方法被存根以返回“Hello!”,而整数值静态方法使用默认存根,返回 0。