PowerMockito模拟单个静态方法和返回对象

我想从包含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,它有不同的返回types,所以它给出了一个返回types不匹配的错误。

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获得 。

你想要做的是1和2的全部的组合。

您需要使用PowerMockito.mockStatic为类的所有静态方法启用静态模拟。 这意味着可以使用when-thenReturn语法对它们进行存根。

但是,当你调用一个你没有明确地模拟实例的方法时,你使用的mockStatic的两个参数重载为Mockito / PowerMock提供了一个默认策略。

从javadoc :

用指定的策略创build类模拟,以便交互的答案。 这是相当先进的function,通常你不需要它写出体面的testing。 但是,使用旧系统时可能会有所帮助。 这是默认的答案,所以只有当你不存在方法调用时才会使用它。

默认的默认存根策略是仅仅为对象,数字和布尔值方法返回null,0或者false。 通过使用2-arg重载,你会说“不,不,默认情况下使用这个Answer子类”的answer方法来获得一个默认值,它返回一个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()); } } 

string值的静态方法被stubbed返回“Hello!”,而int值的静态方法使用默认的stubbing,返回0。