0

Я пытаюсь данные для тестирования DB блока установки путем заполнения таблицы, которая имеет столбцы типа TIMESTAMP(6) WITH TIME ZONE следующим образом:Как населён TIMESTAMP Oracle с полем ZONE с использованием DBUnit FlatXmlDataSet

<timetable START_TIME="2015-03-01 10.00.00.000000000" END_TIME="2015-03-02 10.00.00.000000000"/> 

Но я получаю следующее исключение при запуске теста:

org.dbunit.dataset.NoSuchColumnException: TIMETABLE.START_TIME - (Non-uppercase input column: START_TIME) in ColumnNameToIndexes cache map. Note that the map's column names are NOT case sensitive. 
    at org.dbunit.dataset.AbstractTableMetaData.getColumnIndex(AbstractTableMetaData.java:117) 
    at org.dbunit.operation.AbstractOperation.getOperationMetaData(AbstractOperation.java:89) 
    at org.dbunit.operation.AbstractBatchOperation.execute(AbstractBatchOperation.java:143) 
    at org.dbunit.operation.CompositeOperation.execute(CompositeOperation.java:79) 
    at com.github.springtestdbunit.DbUnitRunner.setupOrTeardown(DbUnitRunner.java:194) 
    at com.github.springtestdbunit.DbUnitRunner.beforeTestMethod(DbUnitRunner.java:66) 
    at com.github.springtestdbunit.DbUnitTestExecutionListener.beforeTestMethod(DbUnitTestExecutionListener.java:185) 
    at org.springframework.test.context.TestContextManager.beforeTestMethod(TestContextManager.java:249) 

Я пробовал различные форматы для поля временных меток, включая добавления часового пояса суффиксом + XX: XX 2015-03-01 10.00.00.000000000 +00.00 не увенчались успехом. Я также попытался запустить тест с аргументом VM -Duser.timezone=UTC, но это тоже не помогло.

Кто-нибудь знает, как это можно достичь?

EDIT 1

я заметил следующие предупреждения в консоли:

2016-05-31 14:54:23 WARN SQLHelper:429 - TIMETABLE.START_TIME data type (-101, 'TIMESTAMP(6) WITH TIME ZONE') not recognized and will be ignored. See FAQ for more information. 
2016-05-31 14:54:23 WARN SQLHelper:429 - TIMETABLE.END_TIME data type (-101, 'TIMESTAMP(6) WITH TIME ZONE') not recognized and will be ignored. See FAQ for more information. 

Так выглядит DBUnit не поддерживает TIMESTAMP WITH TIME ZONE тип данных и игнорирует его, отсюда NoSuchColumnException исключение

EDIT 2

Фактически dbunit уже поддерживает типы данных TIMESTAMP через класс OracleDataTypeFactory. Конфигурация будет выглядеть:

<bean id="oracleDataTypeFactory" class="org.dbunit.ext.oracle.OracleDataTypeFactory"/> 

<bean id="dbUnitDatabaseConfig" class="com.github.springtestdbunit.bean.DatabaseConfigBean"> 
     <property name="datatypeFactory" ref="oracleDataTypeFactory" /> 
</bean> 

К сожалению, после того, как эти изменения конфигурации проблема типа данных все еще там, потому что DbUnit DatabaseConfig.datatypeFactory собственность была вновь отброшена на DbUnitTestExecutionListener по умолчанию DefaultDataTypeFactory, который не поддерживает TIMESTAMP типы данных

ответ

0

Мне удалось загрузить данные TIMESTAMP, удалив специальные аннотации Spring-dbunit (@TestExecutionListeners и @DbUnitConfiguration). Мне все еще пришлось использовать @DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD). Затем я использовал «старый» способ Dbunit для настройки и удаления данных и проверки ожиданий данных. Это не так кратки, как аннотации Spring-dbunit @DatabaseSetup, @DatabaseTearDown и @ExpectedDatabase, но он действительно работает (см. Ниже фрагменты кода). Я также сохранил OracleDataTypeFactory в моем тестовом контексте; это важно для того, чтобы тип данных TIMESTAMP распознавался Dbunit.

Я думаю, что проблема, с которой я столкнулась, может быть проявлением ошибки в Listeners Test Execution для Spring-dbunit. Я особенно заподозрить DbUnitTestExecutionListener

Установка:

@Before 
    public void setUp() throws SQLException, IOException, DataSetException, DatabaseUnitException {  
     Resource resource = new ClassPathResource("path/to/data_setup.xml"); 
     FlatXmlDataSetBuilder builder = new FlatXmlDataSetBuilder(); 
     builder.setColumnSensing(true); 
     FlatXmlDataSet dataSetup = builder.build(resource.getInputStream()); 
     DatabaseOperation.CLEAN_INSERT.execute(dbUnitDatabaseConnection, dataSetup);  
    } 

Teardown:

@After 
    public void tearDown() throws SQLException, IOException, DataSetException, DatabaseUnitException { 
     Resource resource = new ClassPathResource("path/to/data_teardown.xml"); 
     FlatXmlDataSet dataTearDown = new FlatXmlDataSetBuilder().build(resource.getInputStream()); 
     DatabaseOperation.DELETE_ALL.execute(dbUnitDatabaseConnection, dataTearDown); 
    } 

Expectation (в пределах метода испытаний):

QueryDataSet actualDataSet = new QueryDataSet(dbUnitDatabaseConnection); 
actualDataSet.addTable("YOUR_TABLE", "<YOUR_SQL_QUERY>"); 
FlatXmlDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(new ClassPathResource("path/to/data_expectation.xml").getInputStream()); 
Assertion.assertEquals(expectedDataSet, actualDataSet);