Дата относительно текущего в наборе данных 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().