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

我想从一个包含2个静态方法 m1和 m2的类模拟一个静态方法 m1。我希望方法 m1返回一个对象。

我试过以下方法

1)

PowerMockito.mockStatic(Static.class, new Answer<Long>() {
@Override
public Long answer(InvocationOnMock invocation) throws Throwable {
return 1000l;
}
});

This is calling both m1 and m2, which has a different return type, so it gives a return type mismatch error.

2) PowerMockito.when(Static.m1(param1, param2)).thenReturn(1000l); 但是在执行 m1时不会调用这个函数。

3) PowerMockito.mockPartial(Static.class, "m1"); 给编译器错误,模拟部分不可用,这是我从 http://code.google.com/p/powermock/wiki/MockitoUsage得到的。

320708 次浏览

你要做的就是把1的部分和2的全部结合起来。

对于类的所有静态方法,您需要使用 PowerMockito.mock 静态到 启动静态模拟。这意味着使用 when-thenReturn 语法将它们存根为 possible

但是您正在使用的弃静态模型的两个参数重载提供了一个默认策略,当您调用一个没有在弃静态模型实例上显式存根的方法时,Mockito/PowerMock 应该这样做。

来自 javadoc:

使用指定的策略创建类模拟 互动。这是相当先进的功能,通常你不需要 它可以写出像样的测试。但是,它可以有助于当工作与 这是默认的答案,因此只有在下列情况下才会使用 你不会停止方法调用。

违约的默认存根策略是只返回对象、数字和布尔值方法的 null、0或 false。通过使用2-arg 重载,您可以说“ No,No,No,缺省情况下使用这个 Answer 子类的 Answer 方法来获得缺省值。它返回一个 Long,所以如果您有一些静态方法返回与 Long 不兼容的内容,那么就有问题了。

Instead, use the 1-arg version of mockStatic to enable stubbing of static methods, then use when-thenReturn to specify what to do for a particular method. For example:

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());
}
}

The String-valued static method is stubbed to return "Hello!", while the int-valued static method uses the default stubbing, returning 0.