Дата относительно текущего в наборе данных DBUnit
Мне интересно, есть ли способ указать, например, завтра как дату в наборе данных XML DBUnit. Иногда логика кода различна для дат в будущем и дат в прошлом, и я хочу проверить оба случая. Конечно, я могу указать что-то вроде 5 ноября 2239 года и быть уверенным, что тест будет работать до этой даты, но есть более элегантный способ.
Я еще не сталкивался с такой ситуацией во время разработки 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
Мне удалось добиться этого с помощью чего-то действительно похожего на то, что делал @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();
}
Это, казалось, добилось цели
Ответ 3
Вы можете использовать add() of Calendar для определения дат в будущем и использования этого в связи с источником данных для JUnit. Я сомневаюсь, что это будет работать с XML-форматом DBUnit. Возможно, вы создаете свой собственный TestCase, который простирается от DBTestCase и реализует метод getDataSet().