java - 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)
有没有办法解决这个问题?
解决方案
避免该问题的唯一方法是通过在命令行或 Maven/Gradle 测试执行配置中设置fakes
系统属性 ( ) 为整个测试运行应用模型(“假”)。-Dfakes=your.fully.qualified.name.SystemMock
根本原因是java.lang.System
该类需要调用内部“ registerNatives()
”方法(或initIDs()
某些其他类中的“ ”),以便恢复该类的原始定义(在它被伪造之后)。JDK 中也有native
方法的其他类没有这样的方法。JMockit 在最近的版本中放弃了对 JDK 9+ 兼容性的调用,也因为它是一个只有 JDK 特性才需要的 hack(应该在 JDK 本身内解决)。
推荐阅读
- java - 检查字符串是否包含字母
- jquery - 对某些 Datatable 列进行排序时出错,但是当我评论“ServerSide”代码时这是正常的(CodeIgniter 4)
- node.js - 我可以在 React 应用程序中使用节点“child_process”吗?
- jenkins - 如何根据来自 Build Failure Analyzer Jenkins 插件的错误类别发送电子邮件/触发参数化远程作业?
- python - 梯度检查点返回值
- java - 声明和安排新任务后,JVM 不会终止
- r - 无法在 Jenkins 上的 R 中安装 devtools
- linux - Zynq、Yocto Linux 和定制 FPGA IP 块工作流程
- pytorch - 为什么代码 A 运行良好而 B 出错?
- json - 如何在不捆绑的情况下使用包裹提供 json 文件?