当前位置: 首页 > 面试题库 >

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

漆雕宏浚
2023-03-14
问题内容

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

一点背景:

我们有一个系统,该系统运行许多会计工作,这些工作围绕其当前日期(例如,每月的1号,每年的1号等)进行逻辑转换。

不幸的是,许多传统代码都调用诸如new Date()或的函数Calendar.getInstance(),而这两个函数最终都调用到System.currentTimeMillis

出于测试目的,现在,我们不得不手动更新系统时钟,以操纵代码认为正在运行测试的时间和日期。

所以我的问题是:

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

提前致谢!


问题答案:

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

这几乎可以通过搜索自动实现,并替换为单例版本:

  • 替换Calendar.getInstance()为Clock.getInstance().getCalendarInstance()。
  • 替换new Date()为Clock.getInstance().newDate()
  • 替换System.currentTimeMillis()为Clock.getInstance().currentTimeMillis()
    (如需要)

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



 类似资料:
  • 我已经成功地用Karma和Webpack为我的沙盒项目设置了测试。代码覆盖率指标由伊斯坦布尔仪器加载器收集。让我困扰的是,我只得到测试中导入的模块的报告覆盖率,所以报告的100%覆盖率实际上是一个肮脏的谎言。 寻找解决方案,我在伊斯坦布尔Instrumenter Loader的自述文件中找到了一段话: 要为所有组件创建代码覆盖率报告(即使是那些尚未进行测试的组件),您必须需要所有1)源代码和2)测

  • 新的一年 之前因为上家公司的经营出了问题,年前的大裁员,过了一个漫长的春节。 之后加入了新公司,然后正好赶上一个很紧急的项目,忙成狗,因此好久没更新文章了。 不过,我又回来啦! 前言 自动化测试,我们将使用karma和nightmare,内容会包括: 单元测试 e2e测试(放下一篇文章) 其实,单元测试一般用在写公共包的时候,比如通用的js函数库,通用的UI组件库。基本不太会在做业务项目的时候还使

  • 我正在将ANT构建转换为Maven。我不用声纳。 在Maven中,Jacoco似乎并没有报告单元测试本身的覆盖率,而ANT报告。我也一直在尝试为我的Maven build获得这个,但是我没有找到任何东西。 似乎我应该添加一个

  • 11.3. 测试覆盖率 就其性质而言,测试不可能是完整的。计算机科学家Edsger Dijkstra曾说过:“测试能证明缺陷存在,而无法证明没有缺陷。”再多的测试也不能证明一个程序没有BUG。在最好的情况下,测试可以增强我们的信心:代码在很多重要场景下是可以正常工作的。 对待测程序执行的测试的程度称为测试的覆盖率。测试覆盖率并不能量化——即使最简单的程序的动态也是难以精确测量的——但是有启发式方法

  • 到目前为止,我已经在IntelliJ中尝试了几个小时的代码覆盖率测试,但没有成功。 RuntimeException:存根! 现在,我已经读到在模块选项中更改依赖顺序可以修复这个问题。所以在改变顺序后,我得到了这个错误: 它指向下面的代码: 我谷歌了又谷歌,但唉,到目前为止我还没有找到解决方案。

  • 但是当我运行test时,两个浏览器实例都打开了(Chrome首先打开并开始执行,延迟后Firefox打开)。在这种情况下,驱动程序对象被Firefox驱动程序覆盖,chrome停止执行。测试继续在Firefox上执行并成功完成。 项目的结构是这样的: 创建了一个DriverBase.class来加载与浏览器对应的驱动程序,该浏览器具有my@beforeSuite. crteated页面的单个类。(