并行运行的时间依赖单元测试,任何变通方法?

时间:2013-09-03 11:33:14

标签: java maven junit jodatime

我有时间依赖单元测试,我必须模拟“现在”。我使用JodaTime,当我需要模拟现在的值以进行时间相关的测试时,我使用DateTimeUtils.setCurrentMillisFixed(...),如接受的问题Time dependent unit tests中的建议所示。

然而,当单元测试并行运行时,这已经引起了问题。正确的解决方案是让所有类从Clock依赖获得当前时间,这可以在测试中被模拟(如Time dependent unit tests中的大多数upvoted答案中所建议的)。但是,我目前没有足够的开发资源来进行重构工作。

我的问题是,是否有办法解决这个问题,以某种方式指定哪些测试可以并行运行,哪些可能没有?有没有办法通过使用DateTimeUtils.setCurrentMillisProvider()来解决这个问题?

测试框架是JUnit4,测试是从maven运行的。

3 个答案:

答案 0 :(得分:2)

按照Parallelism Tips的建议,实施并设置CurrentMillisProviderThreadLocal<Long>中存储“现在”:

  

P.S。 Joda Time有DateTimeUtils,可让您更改库使用的当前时间。它是一个全局变量,但如果您使用DateTimeUtils.setCurrentMillisProvider支持的实现调用ThreadLocal,则在测试使用Joda Time的旧代码时,它将被合理地隔离。

答案 1 :(得分:0)

如果从一个线程开始测试,您可以使用InheritableThreadLocal存储当前时间。

答案 2 :(得分:0)

DateTimeUtils支持ThreadLocal的{​​{1}}已经完成了这项工作。

可悲的是,没有人提供这样的实施 您可以在mentioned by Joe项目中找到一个:https://github.com/restx/restx

以后在测试中你可以用以下方式操纵时间:

ThreadLocalMillisProvider.setCurrentMillisFixed(now.getMillis)
ThreadLocalMillisProvider.setCurrentMillisSystem()

使用JodaTime的课程。

享受!