在我的应用程序中,当测试人员测试应用程序时,需要经常更改日期和时间。目前,我们必须使用系统命令 date -s 来更改系统时间,但这会导致服务器上的其他应用程序也受到影响。我只想更改此应用程序的 Date(),但我不想想要改变应用程序本身,因为有很多地方使用了new Date
The java.util.Date
API 非常非常古老。它被替换为Calendar
API 也是旧的、过时的、糟糕的,而它又被java.time
API - 查看年龄j.u.Date
is?
好歹,j.u.Date
只是不允许你在这里需要什么。它不支持自定义时钟。
But java.time
DOES.
您可以致电:Instant.now()
,这相当于新的 APInew Date()
(j.u.Date 的名字极其糟糕。它根本不代表日期;它代表时间的瞬间)。有一个变体调用:Instant.now(clock)
。这可以让您选择一个自定义时钟。
安排代码获取要使用的时钟实例,例如通过依赖注入,或者有办法设置它,未设置的时钟意味着您默认为系统时钟(Clock.systemUTC()
),但您可以实现自己的时钟实例,它确实可以完全满足您的需要:让测试代码“配置”时钟以返回测试所需的任何日期/时间,而根本不需要弄乱计算机的时钟。
因此,您的解决方案分为三步:
消除旧 API 的所有使用:java.text.DateTimeFormat
, java.util.Date
, java.sql.Timestamp
,这些都需要消失。使用java.time.Instant
, java.time.LocalDateTime
, java.time.LocalDate
, java.time.ZonedDateTime
等等(新的 API 有更多的类型,因为时间本质上比j.u.Date
认为是;这是旧 API 的众多缺陷之一。还消除对的所有调用System.currentTimeMillis()
以及。任何通过过时的 API 获取“当前时间”的内容都需要被淘汰。
设置某种依赖注入解决方案(自己编写,或使用现成的解决方案,如 dagger、guice、spring 等),这样您就可以注入 Clock 的实例。使用Instant.now(clock)
形式来获取“当前”日期和时间,而不是无参数Instant.now()
.
实现时钟的自定义实现,并使用它来设置代码中查询“当前日期/时间”以注入此“测试时钟”的所有各个点。
然后,瞧。测试瓦尔哈拉。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)