您要执行的操作是 1 的部分和全部 2 的组合。
您需要使用 PowerMockito.mockStatic 为类的所有静态方法启用静态模拟。这意味着可以使用 when-thenReturn 语法对它们进行存根。
但是,您正在使用的 mockStatic 的 2 参数重载提供了一个默认策略,用于当您调用尚未在 mock 实例上显式存根的方法时,Mockito/PowerMock 应该执行的操作。
来自 javadoc:
使用指定的策略创建类模拟,以回答其交互。这是一个非常高级的功能,通常你不需要它来编写像样的测试。但是,在使用旧系统时,它可能很有用。它是默认答案,因此仅当不存根方法调用时才会使用它。
默认的默认存根策略是只返回对象、数字和布尔值方法的 null、0 或 false。通过使用 2-arg 重载,您说的是“不,不,不,默认情况下使用此 Answer 子类的答案方法来获取默认值。它返回一个 Long,因此,如果您有静态方法返回与 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。