首页 > 解决方案 > Java11 和 JMockit 1.43 Java.lang.UnsatisfiedLinkError 在 Jmockit mockup System.currentTimeMillis 时发生

问题描述

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

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

标签: javajmockitjava-11

解决方案


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

根本原因是java.lang.System该类需要调用内部“ registerNatives()”方法(或initIDs()某些其他类中的“ ”),以便恢复该类的原始定义(在它被伪造之后)。JDK 中也有native方法的其他类没有这样的方法。JMockit 在最近的版本中放弃了对 JDK 9+ 兼容性的调用,也因为它是一个只有 JDK 特性才需要的 hack(应该在 JDK 本身内解决)。


推荐阅读