我想从一个包含 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 时不会调用它。
3( PowerMockito.mockPartial(Static.class, "m1");
给出编译器错误,模拟部分不可用,这是我从 http://code.google.com/p/powermock/wiki/MockitoUsage 那里得到的。
您要做的是 1 的一部分和 2 的全部的组合。
您需要使用 PowerMockito.mockStatic 为类的所有静态方法启用静态模拟。 这意味着可以使用 when-thenReturn 语法来存根它们。
但是,您使用的 mockStatic 的 2 参数重载提供了一个默认策略,用于在调用尚未在模拟实例上显式存根的方法时 Mockito/PowerMock 应该执行的操作。
来自 javadoc:
使用指定的策略创建类模拟,以回答 相互 作用。这是非常高级的功能,通常您不需要 它是为了编写体面的测试。但是,在使用时可能会有所帮助 遗留系统。这是默认答案,因此仅在以下情况下使用 不存根方法调用。
默认的默认存根策略是只为对象、数字和布尔值方法返回 null、0 或 false。 通过使用 2-arg 重载,您说"不,不,不,默认情况下使用此 Answer 子类的答案方法来获取默认值。 它返回一个 Long,所以如果你有静态方法返回与 Long 不兼容的东西,那就有问题了。
相反,请使用 mockStatic 的 1-arg 版本来启用静态方法的存根,然后使用 when-thenReturn 指定要对特定方法执行的操作。 例如:
import static org.mockito.Mockito.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
class ClassWithStatics {
public static String getString() {
return "String";
}
public static int getInt() {
return 1;
}
}
@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassWithStatics.class)
public class StubJustOneStatic {
@Test
public void test() {
PowerMockito.mockStatic(ClassWithStatics.class);
when(ClassWithStatics.getString()).thenReturn("Hello!");
System.out.println("String: " + ClassWithStatics.getString());
System.out.println("Int: " + ClassWithStatics.getInt());
}
}
字符串值静态方法存根以返回"Hello!",而整数值静态方法使用默认存根,返回 0。