代码之家  ›  专栏  ›  技术社区  ›  learner

jmockit mockup system.currenttimemillis时发生java11和jmockit 1.43 java.lang.unsatisfiedlinkerror

  •  0
  • learner  · 技术社区  · 7 年前

    我试图使用下面的代码模拟System.currentTimeMillis使用jMockit1.43

    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 回复  |  直到 7 年前
        1
  •  0
  •   Rogério    7 年前

    避免这个问题的唯一方法是通过设置 fakes 系统属性( -Dfakes=your.fully.qualified.name.SystemMock )在命令行或maven/gradle测试执行配置中。

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