在JUnit的@Before方法中调用TimeZone.setDefault是否安全?

时间:2018-10-28 17:58:35

标签: java maven junit java-time

Here是有关在JUnit测试的@Before方法中为测试代码设置默认时区的评论。但是TimeZone.setDefault是静态方法。它会影响使用@Before并且TimeZone.setDefault成功完成测试之后运行的其他测试吗?

2 个答案:

答案 0 :(得分:1)

这里要检查很多事情,这取决于您如何运行测试。

以下因素可能需要考虑:

  1. 由于您在一个问题中标记了“ maven”:负责运行测试的Maven的surefire / failsafe插件可以在1个或多个JVM中同时运行多个测试,所以这完全取决于它们的配置。 因此,即使在本地通过测试,测试也可能会在构建过程中偶尔开始失败。

  2. 在测试用例中,分别在每个测试之前和之后调用
  3. @Before@After。即使测试失败,也会调用@After。因此,记住默认时区并在测试后将其重新设置应该没问题,但不能“重新设置”“ @After”块中的状态可能会导致后续测试中的定义不正确。

恕我直言,更好的方法是使用java.time.Clock抽象。参见this question for examples

另一个可能的选择是重构代码以使用一些“工厂”来提供当前日期/时间。然后,在单元测试中,您可以实例化该工厂并将其作为依赖项“注入”到被测代码中。一种手工制作的时钟

答案 1 :(得分:0)

它将影响其他测试(如您假设的那样),因为在运行单个测试后不会将其重置。 可以通过@After方法将其重置为“正常”,也可以更改代码以获取/注入“现在”的时间戳,然后使代码从此处进行计算。根据我的经验,这将为您提供更多的灵活性。