我想从包含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");
给出了mockPartial不可用的编译器错误,这是我从http://code.google.com/p/powermock/wiki/MockitoUsage得到的。
答案 0 :(得分:113)
你想要做的是1部分和2部分的组合。
对于类的所有静态方法,您需要使用PowerMockito.mockStatic来启用静态模拟。这意味着使
但是你正在使用的mockStatic的2参数重载提供了一个默认策略,当你调用一个你没有在mock实例上明确存根的方法时Mockito / PowerMock应该做什么。
来自javadoc:
为其答案创建具有指定策略的类模拟 互动。它是非常先进的功能,通常你不需要 它写出体面的测试。但是在使用它时会很有帮助 遗留系统。这是默认答案,因此仅在使用时才使用 你没有存根方法调用。
默认默认存根策略是为对象,数字和布尔值方法返回null,0或false。通过使用2-arg重载,你会说“不,不,不,默认情况下使用此Answer子类'的答案方法来获取默认值。它返回一个Long,所以如果你有静态方法返回与之不兼容的东西很长,有一个问题。
相反,使用1-arg版本的mockStatic来启用静态方法的存根,然后使用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!”,而int值静态方法使用默认存根,返回0。