我想从包含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时不会调用此方法。
PowerMockito.when(Static.m1(param1, param2)).thenReturn(1000l);
3)PowerMockito.mockPartial(Static.class, "m1"); 给出了我不能从http://code.google.com/p/powermock/wiki/MockitoUsage获得的,无法提供模拟部分的编译器错误。
PowerMockito.mockPartial(Static.class, "m1");
你想要做的是1的一部分和2的全部的组合。
你需要使用PowerMockito.mockStatic为类的所有静态方法启用静态模拟。这意味着可以使用when-thenReturn语法对它们进行存根。
但是,当你调用尚未在模拟实例上显式存根的方法时,你正在使用的2个参数的mathStatic重载为Mockito / PowerMock应该执行的操作提供了默认策略。
从javadoc:
创建具有指定策略的类模拟,以解决交互问题。这是一个非常高级的功能,通常你不需要它来编写不错的测试。但是,在使用旧系统时可能会有所帮助。这是默认答案,因此仅当你不存根方法调用时才会使用它。
该默认默认磕碰的策略是只返回NULL,0或假的对象,数量和布尔值的方法。通过使用2-arg重载,你说的是“不,不,不,默认情况下,使用此Answer子类的answer方法获取默认值。它返回Long,因此,如果你有静态方法返回的值与长期存在问题。
而是使用模拟静态的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。