0

ich für eine DB-Einheit Test-Setup-Daten versuche durch eine Tabelle bevölkern, die Spalten des Typs hat TIMESTAMP(6) WITH TIME ZONE wie folgt:Wie eine Oracle-TIMESTAMP WITH ZONE Feld aufzufüllen DBUnit FlatXmlDataSet mit

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

Aber ich bekomme immer wieder die folgende Ausnahme, wenn ich den Probelauf:

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) 

I verschiedene Formate für das Zeitstempel-Feld einschließlich der Zugabe von der Zeitzone versucht + suffix XX: XX 2015-03-01 10.00.00.000000000 +00.00 ohne Erfolg. Ich habe auch versucht, den Test mit dem VM-Argument -Duser.timezone=UTC auszuführen, aber das half auch nicht.

Weiß jemand, wie dies erreicht werden kann?

EDIT 1

bemerkte ich die folgenden Warnungen in der Konsole:

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. 

So ist es wie DBUnit sieht nicht TIMESTAMP WITH TIME ZONE Datentyp und ignoriert sie nicht unterstützt, damit die NoSuchColumnException Ausnahme

EDIT 2

Tatsächlich unterstützt dbunit bereits TIMESTAMP Datentypen über die OracleDataTypeFactory Klasse. Die Konfiguration würde dann wie folgt aussehen:

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

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

Leider nachdem diese Konfiguration der Datentyp Problem ändert sich immer noch da war, weil DBUnit DatabaseConfig.datatypeFactory Eigenschaft wurde DefaultDataTypeFactory von DbUnitTestExecutionListener auf die Standardeinstellung wieder zurückgesetzt, die nicht TIMESTAMP unterstützt Datentypen

Antwort

0

Ich konnte TIMESTAMP Daten durch Entfernen von Spring-dbunit spezifischen Anmerkungen (@TestExecutionListeners und @DbUnitConfiguration) laden. Ich musste immer noch @DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD) verwenden. Ich habe dann den "alten" Dbunit-Weg genutzt, um Daten aufzusetzen und abzubauen und die Datenerwartungen zu überprüfen. Dies ist nicht so prägnant wie Spring-dbunit-Annotationen @DatabaseSetup, @DatabaseTearDown und @ExpectedDatabase, aber es funktioniert (siehe Code-Schnipsel unten). Ich habe auch OracleDataTypeFactory in meinem Testkontext behalten; Dies ist wichtig, damit der TIMESTAMP-Datentyp von Dbunit erkannt wird.

Ich denke, das Problem, mit dem ich konfrontiert wurde, könnte die Manifestation eines Fehlers in Spring-Dbunit Test Execution Listeners sein. Ich bin besonders Verdacht DbUnitTestExecutionListener

Setup:

@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); 
    } 

Erwartung (innerhalb der Testmethode):

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);