JMockit模拟System.currentTimeMillis()

问题描述 投票:1回答:4

运行此测试:

@Test
public void testSystemCurrentTimeMillis() {
    new NonStrictExpectations(System.class) {{
        System.currentTimeMillis(); result = 1438357206679L;
    }};
    long currentTime = System.currentTimeMillis();
    assertEquals(1438357206679L, currentTime);
}

我收到IllegalStateException:

java.lang.IllegalStateException: Missing invocation to mocked type at this point; please make sure such invocations appear only after the declaration of a suitable mock field or parameter
    at unittests.DateTest$1.(DateTest.java:24)
    at unittests.DateTest.testSystemCurrentTimeMillis(DateTest.java:23)

我的测试(JMockit 1.18)出了什么问题?

java unit-testing jmockit
4个回答
1
投票

和JMockit这么多东西一样,这很容易做到。试试这个..

@Test
public void testSystemCurrentTimeMillis(@Mocked final System unused) {
    new NonStrictExpectations() {{
        System.currentTimeMillis(); result = 1438357206679L;
    }};
    long currentTime = System.currentTimeMillis();
    assertEquals(1438357206679L, currentTime);
}

顺便说一句,发现this网站是一个很好的参考。可能你被静态方法绊倒了。您需要做的就是使用静态方法将类声明为mocked - 您永远不需要引用该变量,因此我将其命名为“unused”。


2
投票

我的最终解决方案是为系统创建一个MockUp,它只模拟方法currentTimeMillis():

private static class SystemMock extends MockUp<System> {
    @Mock
    public static long currentTimeMillis() {
        return 10000000L;
    }
}

@Test
public void testAddNowDate() {
    new SystemMock();
    long currentTime = System.currentTimeMillis();
    assertEquals(10000000L, currentTime);
}

1
投票

在JMockit版本1.17中引入了这个东西只是为了使用带有NonStrictExpectation(){}块的对象引用,Mocked的Deprecated属性值

不推荐使用@Mocked的“value”属性,该属性用于“静态”部分模拟。现有的用法应该用“动态”部分模拟替换,通过在调用Expectations(Object ...)构造函数时传递实例或类来部分模拟,或者应用MockUp类。

请参考以下链接:JMockit version history


0
投票

是的,这是部分嘲弄。通过nonStrictExpectation(){}中的小修正,您上面提到的代码也可以修复:

@Mocked
private System system;

new NonStrictExpectations() {{
    System.currentTimeMillis(); 
    result = 1438357206679L;
}};

long currentTime = System.currentTimeMillis();
assertEquals(1438357206679L, currentTime);

这也应该有效。

© www.soinside.com 2019 - 2024. All rights reserved.