3

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

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

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

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

4

3 回答 3

2

按照这些Parallelism Tips中的建议,实施并设置 aCurrentMillisProvider将“现在”存储在 a中:ThreadLocal<Long>

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

于 2013-09-06T16:16:26.757 回答
0

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

于 2013-09-03T11:36:10.207 回答
0

Joe已经提到过实施DateTimeUtilsbacked withThreadLocal可以完成这项工作。

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

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

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

使用在引擎盖下使用 JodaTime 的类。

享受!

于 2018-02-20T11:40:56.003 回答