java - 为什么mockStatic 的行为不符合预期?

标签 java unit-testing junit mockito powermock

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

非常感谢。

最佳答案

您正在模拟静态类,这意味着如果您没有显式定义 when()..then() 行为,Mockito 将返回默认值(如果是 long,则为 0)。

您必须使用 spy Activity 才能仅模拟某些方法并让其他方法按实现运行:

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 >.

关于java - 为什么mockStatic 的行为不符合预期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42133800/

相关文章:

java - 如何使用 Spring reactive 通过增量进度更新逐一处理每个产品?

java - 如何在Web项目中部署persistence.xml?

java - 将 VARBINARY 转换为 PDF

c# - 如何使用 Nunit 和 RhinoMocks 模拟 HttpContext.Current.GetOwinContext()?

java - 模拟结果集 getTimeStamp 不适用于超过 1 行

eclipse - 如何为Eclipse中的所有测试设置环境变量?

java - 无法使用外部 jar 文件在远程命令行中运行 java

c++ - 如何排除在 Eclipse (C++) 中构建的源文件?

unit-testing - 私有(private)/ protected 方法是否应该进行单元测试?

java - 没有名为 testPU 的 EntityManager 的持久性提供程序