Java11 и JMockit 1.43 Java.lang.UnsatisfiedLinkError произошла, когда макет Jmockit System.currentTimeMillis - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь смоделировать 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 Ответ

0 голосов
/ 01 февраля 2019

Единственный способ избежать этой проблемы - применить макет («подделка») для всего теста, установив системное свойство fakes (-Dfakes=your.fully.qualified.name.SystemMock) в командной строке или в конфигурации выполнения теста Maven / Gradle..

Основная причина заключается в том, что классу java.lang.System требуется вызов внутреннего метода "registerNatives()" (или "initIDs()" в некоторых других классах) для первоначального определениякласс (после того, как это сделано подделкой), чтобы быть восстановленным.Другие классы в JDK, которые также имеют native методы, не имеют такого метода.JMockit отбросил вызов в последних версиях для совместимости с JDK 9+, а также потому, что это был хак, сделанный необходимым только из-за особенностей JDK (которые должны быть решены в самом JDK).

...