2010-12-14 34 views
0

我有Java的单元测试,它向本地测试数据库中的一行写入一个常量Timestamp,并将其读回并将其与我的预期进行比较。这适用于GMT时区下的本地笔记本电脑。处理本地和远程数据库TimeZone差异的测试

当我将代码提交给我们的持续集成服务器时,测试失败,时间差异为-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); 

感谢,

+0

你应该详细说明你如何比较时间戳,作为整数?作为字符串? – Guillaume 2010-12-14 11:56:46

+0

是的,请显示单元测试的详细信息:) – 2010-12-14 11:59:04

+0

时间戳比较由DBUnit完成 – Scruffers 2010-12-14 11:59:12

回答

4

您可以set a timezone为MySQL服务器从操作系统时区分开,甚至个别数据库会话。前者是国际海事组织的首选,因为除了用户界面和导入数据以外,其他地方都使用UTC

0

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

0

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

请参阅this question的答案。

+0

但我的单元测试正在测试DAO是否正确写入数据库。我已经写了一个恒定的时间戳感谢模拟,但问题是,它必须通过数据库写入测试 - 如果时区不同,描述它会导致一个问题... – Scruffers 2010-12-14 12:08:36

+0

对于这个问题, d主张与其他人一样回答,只保留UTC中的所有数据库时间并仅使用时区显示。 – 2010-12-14 12:17:07

1

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

"/dbunit/expected_insert_batch.xml" 

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

-1

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

+0

DAO测试总是依赖于它运行的数据库,但我同意在一般测试中应该是环境不可知的。 – Scruffers 2010-12-15 14:55:44

相关问题