我有时间依赖单元测试,我必须模拟“现在”。我使用JodaTime,当我需要模拟现在的值以进行时间相关的测试时,我使用DateTimeUtils.setCurrentMillisFixed(...),如接受的问题Time dependent unit tests中的建议所示。
然而,当单元测试并行运行时,这已经引起了问题。正确的解决方案是让所有类从Clock依赖获得当前时间,这可以在测试中被模拟(如Time dependent unit tests中的大多数upvoted答案中所建议的)。但是,我目前没有足够的开发资源来进行重构工作。
我的问题是,是否有办法解决这个问题,以某种方式指定哪些测试可以并行运行,哪些可能没有?有没有办法通过使用DateTimeUtils.setCurrentMillisProvider()来解决这个问题?
测试框架是JUnit4,测试是从maven运行的。
答案 0 :(得分:2)
按照Parallelism Tips的建议,实施并设置CurrentMillisProvider
在ThreadLocal<Long>
中存储“现在”:
P.S。 Joda Time有DateTimeUtils,可让您更改库使用的当前时间。它是一个全局变量,但如果您使用
DateTimeUtils.setCurrentMillisProvider
支持的实现调用ThreadLocal
,则在测试使用Joda Time的旧代码时,它将被合理地隔离。
答案 1 :(得分:0)
如果从一个线程开始测试,您可以使用InheritableThreadLocal存储当前时间。
答案 2 :(得分:0)
DateTimeUtils
支持ThreadLocal
的{{1}}已经完成了这项工作。
以后在测试中你可以用以下方式操纵时间:
ThreadLocalMillisProvider.setCurrentMillisFixed(now.getMillis)
ThreadLocalMillisProvider.setCurrentMillisSystem()
使用JodaTime的课程。
享受!