14

我想知道是否有任何方法可以将例如明天指定为 DBUnit XML 数据集中的日期。有时代码逻辑对于未来的日期和过去的日期是不同的,我想测试这两种情况。当然,我可以指定诸如 2239 年 11 月 5 日之类的内容,并确保该测试将一直有效到该日期,但是否有更优雅的方式。

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

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

4

4 回答 4

25

我刚开始使用 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));

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

希望这可以帮助。祝你好运。

于 2010-06-18T18:37:23.903 回答
2

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

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

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

文档中的一些示例:

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

我已经设法通过与@loyalBrown 所做的非常相似的事情来实现这一点,但我不能完全这样做,因为那里缺少一些进一步的信息,我正在使用 @DatabaseSetup("/pathToXML") 实例化我当前的数据源

所以这就是我所做的:

首先,我需要删除注释,您现在需要使用以下代码以编程方式启动此 .xml 文件:

@Inject
protected DataSource dataSource;

@Before
public void setUp() throws Exception {
        DataSourceDatabaseTester dataSourceDatabaseTester = new DataSourceDatabaseTester(dataSource);
        IDataSet dataSet = new FlatXmlDataSetBuilder().build(new FileInputStream(getClass().getResource(DATASET_FILE_LOCATION).getPath()));
        ReplacementDataSet rDataSet = new ReplacementDataSet(dataSet);
        rDataSet.addReplacementObject("{$today}", new Date());
        dataSourceDatabaseTester.setDataSet(rDataSet);
        dataSourceDatabaseTester.onSetup(); 
}

这似乎可以解决问题

于 2019-09-23T15:28:56.057 回答
0

您可以使用Calendar 的 add()来定义未来的日期,并将其与 JUnit 的数据源结合使用。我怀疑这是否适用于 DBUnit 的 XML 格式。可能是您创建自己的从 DBTestCase 扩展的 TestCase 并实现 getDataSet() 方法。

于 2010-05-18T12:01:42.367 回答