处理本地与远程数据库TimeZone测试差异

时间:2010-12-14 11:50:13

标签: java mysql timezone dbunit

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

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

如果没有将我的本地MySQL服务器更改为与远程服务器具有相同的时区(并且我的团队中的所有开发人员都这样做了),是否有人可以告诉我如何在代码中修复此问题而不会太过于hacky?< / p>

//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);

谢谢,

5 个答案:

答案 0 :(得分:4)

您可以set a timezone将MySQL服务器与OS时区分开,甚至是单独的数据库会话。前者是IMO的首选,除了UI和导入数据外,其他地方都使用UTC

答案 1 :(得分:1)

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

"/dbunit/expected_insert_batch.xml" 

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

查看this question的答案。

答案 4 :(得分:-1)

您需要让您的测试不依赖于环境。寻找可以使这个领域变得动态的地方,它应该可以在任何地方使用。