为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Qyouu 2019-10-16 14:30:05
System.currentTimeMillis除了在主机上手动更改系统时钟外,是否可以通过代码或JVM参数覆盖通过(通过)显示的当前时间?一点背景:我们有一个系统,该系统运行许多会计工作,这些工作围绕着当前日期(例如,每月的1号,每年的1号等)围绕其大部分逻辑进行处理。不幸的是,许多传统代码都调用诸如new Date()或的函数Calendar.getInstance(),而这两个函数最终都调用到System.currentTimeMillis。出于测试目的,目前,我们只能手动更新系统时钟,以操纵代码认为正在运行测试的时间和日期。所以我的问题是:有没有办法覆盖返回的内容System.currentTimeMillis?例如,要告诉JVM在从该方法返回之前自动添加或减去一些偏移量?提前致谢!
查看完整描述

3 回答

?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

强烈建议您不要乱搞系统时钟,而要硬着头皮,重构该旧代码以使用可替换的时钟。理想情况下,应该使用依赖项注入来完成,但是即使您使用了可替换的单例,您也将获得可测试性。

搜索和替换单例版本几乎可以实现自动化:

  • 替换Calendar.getInstance()Clock.getInstance().getCalendarInstance()

  • 替换new Date()Clock.getInstance().newDate()

  • 替换System.currentTimeMillis()Clock.getInstance().currentTimeMillis()

(根据需要等)

迈出第一步后,您可以一次用DI替换单例。


查看完整回答
反对 回复 2019-10-16
  • 3 回答
  • 0 关注
  • 895 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信