0

我在 Java 中进行了单元测试,它将一个常量时间戳写入本地测试数据库中的一行,将其读回并将其与我的预期进行比较。这在我位于 GMT 时区的本地笔记本电脑上运行良好。

当我将代码提交到我们的持续集成服务器时,测试失败,时间不同为 -5 小时。这并不奇怪,因为我们的集成服务器托管在美国东海岸的 AWS 上。但是,它正在引起一个问题......

如果没有将我的本地 MySQL 服务器更改为与远程服务器具有相同的时区(并且让我团队中的所有开发人员也这样做),任何人都可以告诉我如何在代码中解决这个问题而不会太老套吗?

//Fetch actual table contents
IDataSet databaseDataSet = databaseTester.getConnection().createDataSet();
ITable actualTable = databaseDataSet.getTable("batch");

// Load expected data from an XML dataset
IDataSet expectedDataSet = new XmlDataSet(getClass().getResourceAsStream("/dbunit/expected_insert_batch.xml"));
ITable expectedTable = expectedDataSet.getTable("batch");

// Assert actual database table match expected table
Assertion.assertEquals(expectedTable, actualTable);

谢谢,

4

5 回答 5

4

您可以为 MySQL 服务器设置一个独立于操作系统时区的时区,甚至可以为单个数据库会话设置一个时区。前者是 IMO 更可取的,因为除了 UI 和导入数据时,在任何地方都使用UTC 。

于 2010-12-14T11:57:57.047 回答
1

我建议您让所有系统都使用相同的时区,例如 UTC/GMT+0,并且仅在向用户显示或报告时使用时区。

于 2010-12-14T12:00:16.517 回答
1

好的,这可能不是最好的选择,但为什么不创建另一个

"/dbunit/expected_insert_batch.xml" 

为您的 CI 服务器。然后在您的单元测试中为时区添加一个开关。

于 2010-12-14T12:46:25.587 回答
0

如果您在 Java 中创建时间戳,我建议使用模拟,这样它就完全不依赖于系统。

有关想法,请参阅此问题的答案。

于 2010-12-14T12:03:12.763 回答
-1

您需要使您的测试不依赖于环境。寻找可以使该字段动态化的地方,并且它应该可以在任何地方工作。

于 2010-12-14T14:37:36.843 回答