我在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);
谢谢,
答案 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)
您需要让您的测试不依赖于环境。寻找可以使这个领域变得动态的地方,它应该可以在任何地方使用。