相对于 DBUnit 数据集中的当前日期

2022-09-03 12:19:56

我想知道是否有任何方法可以在DBUnit XML数据集中指定例如明天作为日期。有时,对于将来的日期和过去的日期,代码逻辑是不同的,我想测试这两种情况。当然,我可以指定像2239年11月5日这样的东西,并确保测试将在此日期之前工作,但有更优雅的方式。

在我的Java开发过程中,我还没有遇到过这种情况,但是我曾经有过这样的经历,即日期前一天,日期前两天和日期前两天以上的代码逻辑是不同的。在这种情况下,编写数据库驱动测试的唯一可能的解决方案是在数据导入期间插入相对日期。

DBUnit 是否为此提供了任何设施?


答案 1

我刚刚开始使用DBUnit,并正在寻找类似的功能。不幸的是,框架中似乎没有日期的表达式语言。但是,我确实使用DBUnit的ReplacementDataSet类找到了合适的解决方法。此类采用 IDataSet 对象并公开方法来替换由 IDataSet 对象从数据集文件中提取的对象。

数据

<dataset>
    <user first_name="Dan"
          last_name="Smith"
          create_date="[create_date]"/>
<dataset>

源代码

String dataSetFile = "testDataFile.xml";
IDataSet dataSet = new FlatXmlDataSetBuilder().build(new FileInputStream(dataSetFile));
ReplacementDataSet rDataSet = new ReplacementDataSet(dataSet);
Set<String> keys = dataSetAdjustments.keySet();
rDataSet.addReplacementObject("[create_date]", DateUtils.addDays(new Date(), -2));

现在,当测试运行时,用户的创建数据将始终设置为运行测试前两天。

希望这有帮助。祝你好运。


答案 2

DbUnit 2.7.0 中添加了新的相对日期/时间语法,您现在可以写入以设置明天的日期,而无需任何额外的设置。[now+1d]

<dataset>
  <user create_date="[now+1d]"/>
<dataset>

文档在这里:
http://dbunit.sourceforge.net/datatypes.html#relativedatetime

文档中的几个示例:

  • [现在] : 当前日期时间
  • [now-1d] : 昨天同一时间
  • [现在+1y+1M-2h] :从今天起一年零一个月,提前两个小时
  • [现在+1d 10:00] : 明天10点

推荐