Date relative to current in the DBUnit dataset
A new relative date/time syntax has been added in DbUnit 2.7.0 and you can now write [now+1d]
to set tomorrow's date without any extra setup.
<dataset>
<user create_date="[now+1d]"/>
<dataset>
The doc is here:
http://dbunit.sourceforge.net/datatypes.html#relativedatetime
A few examples from the doc:
- [now] : current date time
- [now-1d] : the same time yesterday
- [now+1y+1M-2h] : a year and a month from today, two hours earlier
- [now+1d 10:00] : 10 o'clock tomorrow
I've managed to achieve that with something really similar to what @loyalBrown did, but I couldn't do exactly like that as some further information was missing there and I was instantiating my current datasource with @DatabaseSetup("/pathToXML")
So that's what I did:
First I needed to remove the annotation, you need now to start this .xml file programatically with the following code:
@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();
}
This seemed to do the trick
I just started using DBUnit and was looking for similar capabilities. Unfortunately there doesn't seem to be an expression language for dates in the framework. However, I did find a suitable workaround using DBUnit's ReplacementDataSet class. This class takes an IDataSet object and exposes methods to replace objects extracted by the IDataSet object from the data set files.
dataset
<dataset>
<user first_name="Dan"
last_name="Smith"
create_date="[create_date]"/>
<dataset>
source code
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));
Now, when the test runs the user's creation data will always be set to two days before the test was run.
Hope this helps. Good luck.