首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >覆盖Java System.currentTimeMillis以测试时间敏感的代码

覆盖Java System.currentTimeMillis以测试时间敏感的代码
EN

Stack Overflow用户
提问于 2010-01-05 03:39:53
回答 7查看 106K关注 0票数 150

除了手动更改主机上的系统时钟之外,是否有一种方法可以通过代码或使用JVM参数来覆盖通过System.currentTimeMillis呈现的当前时间?

下面是一些背景知识:

我们有一个系统,它运行许多会计作业,这些作业的大部分逻辑都围绕当前日期(例如,每月1号,每年1号等)

不幸的是,许多遗留代码都会调用new Date()Calendar.getInstance()等函数,这两个函数最终都会向下调用System.currentTimeMillis

为了测试的目的,现在,我们被困在手动更新系统时钟来操纵代码认为测试正在运行的时间和日期。

所以我的问题是:

有没有办法覆盖System.currentTimeMillis返回的内容?例如,告诉JVM在从该方法返回之前自动添加或减去一些偏移量?

提前感谢!

EN

Stack Overflow用户

发布于 2017-11-03 17:41:46

如果您运行的是Linux,那么可以使用libfaketime的主分支,或者在测试提交4ce2835时使用。

只需将环境变量设置为您想用来模拟java应用程序的时间,然后使用ld-preloading运行它:

代码语言:javascript
运行
复制
# bash
export FAKETIME="1985-10-26 01:21:00"
export DONT_FAKE_MONOTONIC=1
LD_PRELOAD=/usr/local/lib/faketime/libfaketimeMT.so.1 java -jar myapp.jar

第二个环境变量对于java应用程序非常重要,否则java应用程序将会冻结。在编写本文时,它需要libfaketime的主分支。

如果您想更改systemd管理服务的时间,只需将以下内容添加到您的单元文件覆盖中,例如,对于elasticsearch,这将是/etc/systemd/system/elasticsearch.service.d/override.conf

代码语言:javascript
运行
复制
[Service]
Environment="FAKETIME=2017-10-31 23:00:00"
Environment="DONT_FAKE_MONOTONIC=1"
Environment="LD_PRELOAD=/usr/local/lib/faketime/libfaketimeMT.so.1"

不要忘记使用` `systemctl daemon-reload重新加载systemd

票数 2
EN
查看全部 7 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2001671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档