Java 与时间相关的单元测试在并行运行时中断,有什么解决方法吗?

Java 与时间相关的单元测试在并行运行时中断,有什么解决方法吗?,java,maven,junit,jodatime,Java,Maven,Junit,Jodatime,我有依赖于时间的单元测试,其中我必须模拟“现在”。我使用JodaTime,当我需要模拟now的值以进行时间相关测试时,我使用DateTimeUtils.setCurrentMillisFixed(…),正如所讨论的公认答案中所建议的那样 然而,当单元测试并行运行时,这就造成了问题。正确的解决方案是让所有类都从时钟依赖中获取当前时间,而时钟依赖可以在测试中模拟出来(如中大多数上浮答案所示)。然而,我目前没有足够的开发资源来进行重构 我的问题是,有没有办法通过某种方式指定哪些测试可以并行运行,哪些不

我有依赖于时间的单元测试,其中我必须模拟“现在”。我使用JodaTime,当我需要模拟now的值以进行时间相关测试时,我使用DateTimeUtils.setCurrentMillisFixed(…),正如所讨论的公认答案中所建议的那样


然而,当单元测试并行运行时,这就造成了问题。正确的解决方案是让所有类都从时钟依赖中获取当前时间,而时钟依赖可以在测试中模拟出来(如中大多数上浮答案所示)。然而,我目前没有足够的开发资源来进行重构

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


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

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

实现并设置一个
CurrentMillisProvider
,将“now”存储在
ThreadLocal
中,如下所示:

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

ThreadLocal
支持的
DateTimeUtils
的实现已经可以完成这项工作

遗憾的是,没有人提供这样的实现。
您可以在project中找到一个:

在以后的测试中,您可以通过以下方式操纵时间:

ThreadLocalMillisProvider.setCurrentMillisFixed(now.getMillis)
ThreadLocalMillisProvider.setCurrentMillisSystem()
在后台使用JodaTime的类


享受吧

“然而,我目前没有足够的开发资源来进行重构”:您可以拆分测试用例,使重构后的测试并行运行,而遗留测试不并行运行,然后在重构时逐个移动这些用例。我同意,但是我该如何分割它们呢?在使用JUnit和maven时,如何使一些测试并行运行,而另一些测试不并行运行?