Here是有关在JUnit测试的@Before
方法中为测试代码设置默认时区的评论。但是TimeZone.setDefault
是静态方法。它会影响使用@Before
并且TimeZone.setDefault
成功完成测试之后运行的其他测试吗?
答案 0 :(得分:1)
这里要检查很多事情,这取决于您如何运行测试。
以下因素可能需要考虑:
由于您在一个问题中标记了“ maven”:负责运行测试的Maven的surefire / failsafe插件可以在1个或多个JVM中同时运行多个测试,所以这完全取决于它们的配置。 因此,即使在本地通过测试,测试也可能会在构建过程中偶尔开始失败。
@Before
和@After
。即使测试失败,也会调用@After
。因此,记住默认时区并在测试后将其重新设置应该没问题,但不能“重新设置”“ @After”块中的状态可能会导致后续测试中的定义不正确。
恕我直言,更好的方法是使用java.time.Clock
抽象。参见this question for examples
另一个可能的选择是重构代码以使用一些“工厂”来提供当前日期/时间。然后,在单元测试中,您可以实例化该工厂并将其作为依赖项“注入”到被测代码中。一种手工制作的时钟
答案 1 :(得分:0)
它将影响其他测试(如您假设的那样),因为在运行单个测试后不会将其重置。
可以通过@After
方法将其重置为“正常”,也可以更改代码以获取/注入“现在”的时间戳,然后使代码从此处进行计算。根据我的经验,这将为您提供更多的灵活性。