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

时间:2010-05-18 11:41:07

标签: java unit-testing dbunit

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

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

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

4 个答案:

答案 0 :(得分:24)

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

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

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

答案 1 :(得分: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(); 
}

这似乎可以解决问题

答案 2 :(得分:1)

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]:从今天起一年零一个月,早两个小时
  • [now + 1d 10:00]:明天10点

答案 3 :(得分:0)

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