如何使用Dbunit FlatXmlDataSet用区域字段填充Oracle时间戳
我试图通过填充一个表来为DB单元测试设置数据,该表的列类型为如何使用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
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.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(预期数据集、实际数据集);