除了手动更改主机上的系统时钟之外,有没有办法在代码中或使用 JVM 参数覆盖当前时间,如通过 System.currentTimeMillis
?
一点背景:
我们有一个运行许多会计工作的系统,这些工作的大部分逻辑都围绕当前日期(即每月的第一天、今年的第一天等)
不幸的是,许多遗留代码调用函数,例如 new Date()
或 Calendar.getInstance()
,它们最终都调用到 System.currentTimeMillis
。
出于测试目的,现在,我们坚持手动更新系统时钟来操纵代码认为测试正在运行的时间和日期。
所以我的问题是:
有没有办法覆盖 System.currentTimeMillis
返回的内容?例如,告诉 JVM 在从该方法返回之前自动添加或减去一些偏移量?
原文由 Mike Clark 发布,翻译遵循 CC BY-SA 4.0 许可协议
我 强烈 建议您不要弄乱系统时钟,而是硬着头皮重构遗留代码以使用可替换时钟。 _理想情况下_,这应该通过依赖注入来完成,但即使您使用可替换的单例,您也会获得可测试性。
对于单例版本,这几乎可以通过搜索和替换实现自动化:
Calendar.getInstance()
替换为Clock.getInstance().getCalendarInstance()
。new Date()
替换为Clock.getInstance().newDate()
System.currentTimeMillis()
替换为Clock.getInstance().currentTimeMillis()
(根据需要等)
迈出第一步后,您可以一次用 DI 替换单例。