【问题标题】:Java11 and JMockit 1.43 Java.lang.UnsatisfiedLinkError happened when Jmockit mockup System.currentTimeMillisJava11 和 JMockit 1.43 Java.lang.UnsatisfiedLinkError 在 Jmockit mockup System.currentTimeMillis 时发生
【发布时间】:2019-01-31 05:14:09
【问题描述】:

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

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

【问题讨论】:

  • 我相信这仍然不是一个完整的堆栈跟踪。请分享完整的详细信息,以便更好地了解原因。
  • 我已经更新了完整的堆栈跟踪

标签: java jmockit java-11


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-14
    • 2015-12-24
    • 2020-02-21
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多