与时间相关的单元测试在并行运行时中断,任何解决方法



我有时间相关的单元测试,我必须在其中模拟"现在"。我使用 JodaTime,当我需要模拟现在的值以进行时间相关测试时,我使用 DateTimeUtils.setCurrentMillisFixed(...(,正如相关时间相关单元测试中接受的答案中所建议的那样。

但是,这在并行运行单元测试时现在会导致问题。正确的解决方案是让所有类从时钟依赖项中获取当前时间,该依赖项可以在测试中模拟出来(如时间相关单元测试中大多数赞成的答案所建议的那样(。但是,我目前没有足够的开发资源来进行重构工作。

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

测试

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

实现并设置一个CurrentMillisProvider,将"now"存储在ThreadLocal<Long>中,如以下并行性提示所示:

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

如果测试从一个线程启动,则可以使用 InheritableThreadLocal 来存储当前时间。

Joe 已经提到过,ThreadLocal支持的 DateTimeUtils 的实现可以完成这项工作。

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

稍后在测试中,您可以使用以下命令操作时间:

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

在引擎盖下使用JodaTime的课程。

享受!

相关内容

最新更新