为什么 mockStatic 的行为不如预期?

Why mockStatic doesn't behave as expected?

mockito-核心版本:1.10.19

powermock 版本:1.6.6

我尝试模拟一些静态方法,但输出让我感到困惑。 这是我的代码:

class ClassWithStatics {
    public static int getNextInt() {
        return getInt() + 1;
    }

    public static int getInt() {
        return 1;
    }

    public static long getTime() {
        return System.currentTimeMillis();
    }
}

@RunWith(PowerMockRunner.class)
@PrepareForTest({ClassWithStatics.class, System.class})
public class StubJustOneStatic {
    @Test
    public void test() {
        PowerMockito.mockStatic(ClassWithStatics.class);
        Mockito.when(ClassWithStatics.getInt()).thenReturn(0);

        PowerMockito.mockStatic(System.class);
        Mockito.when(System.currentTimeMillis()).thenReturn(12345L);

        System.out.println("Next Int: " + ClassWithStatics.getNextInt());
        System.out.println("Int: " + ClassWithStatics.getInt());
        System.out.println("Time:" + ClassWithStatics.getTime());
    }
}

输出为

Next Int: 0
Int: 0
Time:0

但是当我使用下面的代码时,ClassWithStatics.getTime() 打印出我想要的内容。

@RunWith(PowerMockRunner.class)
@PrepareForTest({ClassWithStatics.class, System.class})
public class StubJustOneStatic {
    @Test
    public void test() {
         //  PowerMockito.mockStatic(ClassWithStatics.class);
         //  Mockito.when(ClassWithStatics.getInt()).thenReturn(0);

        PowerMockito.mockStatic(System.class);
        Mockito.when(System.currentTimeMillis()).thenReturn(12345L);

        //  System.out.println("Next Int: " + ClassWithStatics.getNextInt());
        //  System.out.println("Int: " + ClassWithStatics.getInt());
        System.out.println("Time:" + ClassWithStatics.getTime());
    }
}

非常感谢。

你正在模拟静态 class 这意味着如果你没有明确定义 when()..then() 行为,Mockito 将 return 默认值(0 在情况下长)。

您将不得不使用间谍来仅模拟某些方法并让其他方法 运行 实现:

PowerMockito.spy(ClassWithStatics.class);
Mockito.when(ClassWithStatics.getInt()).thenReturn(5);

现在调用时:

PowerMockito.mockStatic(System.class);
Mockito.when(System.currentTimeMillis()).thenReturn(12345L);

System.out.println("Time:" + ClassWithStatics.getTime());

调用 ClassWithStatics.getInt() 时应该得到 5,调用 ClassWithStatics.getTime().

时应该得到 12345L