如何使用Dbunit FlatXmlDataSet用区域字段填充Oracle时间戳

如何使用Dbunit FlatXmlDataSet用区域字段填充Oracle时间戳,oracle,dbunit,timestamp-with-timezone,spring-test-dbunit,Oracle,Dbunit,Timestamp With Timezone,Spring Test Dbunit,我试图通过填充一个表来为DB单元测试设置数据,该表的列类型为TIMESTAMP(6),带有时区,如下所示: <timetable START_TIME="2015-03-01 10.00.00.000000000" END_TIME="2015-03-02 10.00.00.000000000"/> 我尝试了时间戳字段的不同格式,包括添加时区后缀+XX:XX2015-03-01 10.00.00.000000000+00.00,但没有成功。 我还尝试使用VM参数-Duser.tim

我试图通过填充一个表来为DB单元测试设置数据,该表的列类型为
TIMESTAMP(6),带有时区
,如下所示:

<timetable START_TIME="2015-03-01 10.00.00.000000000" END_TIME="2015-03-02 10.00.00.000000000"/>
我尝试了时间戳字段的不同格式,包括添加时区后缀+XX:XX
2015-03-01 10.00.00.000000000+00.00
,但没有成功。 我还尝试使用VM参数
-Duser.timezone=UTC
运行测试,但也没有任何帮助

有人知道如何做到这一点吗

编辑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似乎不支持带时区的
时间戳
数据类型并忽略它,因此出现了
NoSuchColumnException
异常

编辑2

实际上,dbunit已经通过
OracleDataTypeFactory
类支持
TIMESTAMP
数据类型。然后,配置将如下所示:

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

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


不幸的是,在这些配置更改之后,数据类型问题仍然存在,因为DbUnitTestExecutionListener将dbunit DatabaseConfig.datatypeFactory属性重新设置为默认的
DefaultDataTypeFactory
,它不支持时间戳数据类型

我通过删除特定于Spring的dbunit来加载
时间戳
数据注释(
@TestExecutionListeners
@DbUnitConfiguration
)。我仍然必须使用
@DirtiesContext(classMode=classMode.AFTER\u每个测试方法)
。然后,我使用“旧”Dbunit方法设置和拆卸数据,并检查数据期望值。这不像Spring dbunit注释
@DatabaseSetup
@DatabaseTearDown
@ExpectedDatabase
那样简洁,但确实有效(请参见下面的代码片段)。我还将OracleDataTypeFactory保存在测试上下文中;这对于Dbunit识别时间戳数据类型至关重要

我认为我面临的问题可能是SpringDbUnitTestExecutionListeners中的一个bug的表现。我特别怀疑
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);    
    }
@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);
    }
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);
拆卸:

@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);    
    }
@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);
    }
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);
期望值(试验方法内):

@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);    
    }
@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);
    }
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);
QueryDataSet actualDataSet=newquerydataset(dbUnitDatabaseConnection);
addTable(“您的_表”和“”);
FlatXmlDataSet expectedDataSet=new FlatXmlDataSetBuilder().build(新类路径资源(“path/to/data_expectation.xml”).getInputStream());
assertEquals(预期数据集、实际数据集);

我通过删除Spring dbunit特定的注释(
@TestExecutionListeners
@DbUnitConfiguration
)成功加载了
时间戳
数据。我仍然必须使用
@DirtiesContext(classMode=classMode.AFTER\u每个测试方法)
。然后,我使用“旧”Dbunit方法设置和拆卸数据,并检查数据期望值。这不像Spring dbunit注释
@DatabaseSetup
@DatabaseTearDown
@ExpectedDatabase
那样简洁,但确实有效(请参见下面的代码片段)。我还将OracleDataTypeFactory保存在测试上下文中;这对于Dbunit识别时间戳数据类型至关重要

我认为我面临的问题可能是SpringDbUnitTestExecutionListeners中的一个bug的表现。我特别怀疑
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);    
    }
@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);
    }
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);
拆卸:

@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);    
    }
@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);
    }
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);
期望值(试验方法内):

@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);    
    }
@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);
    }
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);
QueryDataSet actualDataSet=newquerydataset(dbUnitDatabaseConnection);
addTable(“您的_表”和“”);
FlatXmlDataSet expectedDataSet=new FlatXmlDataSetBuilder().build(新类路径资源(“path/to/data_expectation.xml”).getInputStream());
assertEquals(预期数据集、实际数据集);