我正在尝试使用jmockit1.43和下面的代码来模拟System.currentTimeMillis
private static class SystemMock extends MockUp<System>{
@Mock
public static long currentTimeMillis() {
return ourMockCurrentTime;
}
}
但是运行测试时出现以下错误:
00:01:37.658110 [.] [junit] Exception in thread "main" java.lang.UnsatisfiedLinkError: java.lang.System.currentTimeMillis()J
00:01:37.658185 [.] [junit] at java.base/java.lang.System.currentTimeMillis(Native Method)
00:01:37.658188 [.] [junit] at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:544)
00:01:37.658228 [.] [junit] at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:1196)1548910897.658231:
00:01:37.658280 [.] [junit] at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:1041)
有没有办法解决这个问题?
答案 0 :(得分:0)
避免问题的唯一方法是通过在命令行或Maven /中设置fakes
系统属性(-Dfakes=your.fully.qualified.name.SystemMock
)在整个测试过程中应用模型(“假”)。 Gradle测试执行配置。
根本原因是,java.lang.System
类需要调用内部“ registerNatives()
”方法(或某些其他类中的“ initIDs()
”)才能获得原始定义类(在被伪造之后)被还原。 JDK中也有native
方法的其他类没有这样的方法。 JMockit放弃了在最新版本中的JDK 9+兼容性调用,并且还因为它只是因为JDK特质(应在JDK本身内解决)才有必要进行破解。