7

我们正在处理大量数据,所有数据都以 UTC(Java)标记。在读取这些数据、将其存储在数据库中并再次将其取出之间,发生了一些数据在夏令时关闭了一小时。由于 UTC 没有夏令时的概念,这显然是软件中的一个错误。一旦知道,就很容易修复。

但是,无论当前时差如何,有一些单元/集成测试都可以工作会很好 - 例如,我想更改本地时区并在这些不同时区内一遍又一遍地运行一些方法以确保UTC 处理正确。

由于测试应该自动运行,并且最好在一个测试套件中运行,我想知道如何最好地测试正确的行为。在重新启动 JVM 时更改本地设置(如时区)很容易,但在测试套件中运行它并不容易。

有人知道支持这种场景的测试环境、库或模式吗?我们通常使用 JUnit,但如果它有助于摆脱此类问题,我们也愿意添加其他环境/技术。我想它是一个集成而不是单元测试。

编辑:已经有两个非常有用的答案,但我想那里必须有更多的技术。是否有人拥有有关何时/多久调用 TimeZone.getDefault 的权威信息(请参阅 Jon Skeets 答案的评论)?

注意:即使这个问题有一个公认的答案,我也不完全确定要接受哪个答案。即使有这种接受,我也希望看到更多的想法和技术。

感谢您的输入!

4

3 回答 3

8

Java 允许您设置默认时区 (java.util.TimeZone.setDefault)。我之前写过测试,将时区设置为各种不同的选项,并检查一切是否仍然有效。不过要小心 - 如果您要并行化大多数单元测试,则需要使这些单元测试按顺序排列。

我建议您在某些适用夏令时的时区进行测试,而有些则不适用。使用澳大利亚时区也很好,因为 DST 在一年中的相反时间适用于北半球。

于 2009-01-25T17:41:33.660 回答
7

我建议您查看JodaTime,它提供了一些糖来帮助您在代码中更清晰地管理日期/时间/时区类型问题。

我们在整个测试和生产过程中都使用这些,因为它对于日期/时间问题的原生 Java API 是无与伦比的。在 JUnit 中使用这些在测试中可以正常工作

于 2009-01-25T18:32:41.437 回答
1
于 2020-06-03T23:13:07.013 回答