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

Java 相对于DBUnit数据集中当前数据的日期,java,unit-testing,dbunit,Java,Unit Testing,Dbunit,我想知道是否有任何方法可以在dbunitxml数据集中指定例如明天作为日期。有时,未来日期和过去日期的代码逻辑不同,我想测试这两种情况。当然,我可以指定像2239年11月5日这样的日期,并确保测试将一直持续到这个日期,但还有更优雅的方式吗 我在Java开发过程中还没有遇到过这样的情况,但有一次我经历过代码逻辑在日期前一天、日期前两天和日期前两天以上是不同的。在这种情况下,编写数据库驱动测试的唯一可能解决方案是在数据导入期间插入相对日期 DBUnit是否为此提供了任何工具?您可以用来定义将来的日期

我想知道是否有任何方法可以在dbunitxml数据集中指定例如明天作为日期。有时,未来日期和过去日期的代码逻辑不同,我想测试这两种情况。当然,我可以指定像2239年11月5日这样的日期,并确保测试将一直持续到这个日期,但还有更优雅的方式吗

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


DBUnit是否为此提供了任何工具?

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

我刚刚开始使用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));
stringdatasetfile=“testDataFile.xml”;
IDataSet dataSet=new FlatXmlDataSetBuilder().build(新文件输入流(数据集文件));
ReplacementDataSet rDataSet=新的ReplacementDataSet(数据集);
Set keys=dataSetAdjustments.keySet();
rDataSet.addReplacementObject(“[create_date]”,DateUtils.addDays(new date(),-2));
现在,当测试运行时,用户的创建数据将始终设置为测试运行前两天


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

我成功地实现了这一点,使用了与@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(); 
}

这似乎起到了作用

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


文档在这里:

文档中的几个示例:

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

是的,我知道如何用Java计算相对天数。看起来我真的需要手动解析数据集和计算日期。感谢您的详细解释。它真的很有用。我需要在junit中的什么地方添加源代码?在@Before方法中?