Jmockit样机System.currentTimeMillis发生Java11和JMockit 1.43 Java.lang.UnsatisfiedLinkError

时间:2019-01-31 05:14:10

标签: java jmockit java-11

我正在尝试使用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)

有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:0)

避免问题的唯一方法是通过在命令行或Maven /中设置fakes系统属性(-Dfakes=your.fully.qualified.name.SystemMock)在整个测试过程中应用模型(“假”)。 Gradle测试执行配置。

根本原因是,java.lang.System类需要调用内部“ registerNatives()”方法(或某些其他类中的“ initIDs()”)才能获得原始定义类(在被伪造之后)被还原。 JDK中也有native方法的其他类没有这样的方法。 JMockit放弃了在最新版本中的JDK 9+兼容性调用,并且还因为它只是因为JDK特质(应在JDK本身内解决)才有必要进行破解。