有没有办法,无论是在代码中还是使用 JVM 参数,都可以覆盖当前时间,如 System.currentTimeMillis
所示,除了手动更改主机上的系统时钟?
一点背景:
我们有一个系统运行许多会计作业,这些作业的大部分逻辑都围绕当前日期(即本月 1 日、一年 1 日等)
不幸的是,许多遗留代码调用函数,例如 new Date()
或 Calendar.getInstance()
, 两者最终都调用到 System.currentTimeMillis
.
出于测试目的,目前,我们只能手动更新系统时钟来控制代码认为正在运行测试的时间和日期。
所以我的问题是:
有没有办法覆盖 System.currentTimeMillis
返回的内容?例如,告诉 JVM 在从该方法返回之前自动添加或减去一些偏移量?
最佳答案
我强烈建议不要弄乱系统时钟,而是硬着头皮重构旧代码以使用可替换时钟。 理想情况下应该通过依赖注入(inject)来完成,但即使您使用可替换的单例,您也可以获得可测试性。
这几乎可以通过单例版本的搜索和替换实现自动化:
- 将
Calendar.getInstance()
替换为Clock.getInstance().getCalendarInstance()
。 - 将
new Date()
替换为Clock.getInstance().newDate()
- 将
System.currentTimeMillis()
替换为Clock.getInstance().currentTimeMillis()
(根据需要等)
一旦您迈出了第一步,您就可以一次用 DI 替换单例。
关于java - 覆盖 Java System.currentTimeMillis 以测试时间敏感代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2001671/