运行此测试:
@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)出了什么问题?
和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”。
我的最终解决方案是为系统创建一个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);
}
在JMockit版本1.17中引入了这个东西只是为了使用带有NonStrictExpectation(){}块的对象引用,Mocked的Deprecated属性值
不推荐使用@Mocked的“value”属性,该属性用于“静态”部分模拟。现有的用法应该用“动态”部分模拟替换,通过在调用Expectations(Object ...)构造函数时传递实例或类来部分模拟,或者应用MockUp类。
请参考以下链接:JMockit version history
是的,这是部分嘲弄。通过nonStrictExpectation(){}中的小修正,您上面提到的代码也可以修复:
@Mocked
private System system;
new NonStrictExpectations() {{
System.currentTimeMillis();
result = 1438357206679L;
}};
long currentTime = System.currentTimeMillis();
assertEquals(1438357206679L, currentTime);
这也应该有效。