1

TIMESTAMP(6) WITH TIME ZONE次のようなタイプの列を持つテーブルにデータを入力して、DB 単体テスト用のデータをセットアップしようとしています。

<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: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 はデータ型をサポートしておらず、無視しているように見えるTIMESTAMP WITH TIME ZONEため、NoSuchColumnException例外が発生します

編集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 によってDefaultDataTypeFactoryTIMESTAMP データ型をサポートしないデフォルトに再設定されたため、データ型の問題は依然として存在していました。

4

1 に答える 1

0

TIMESTAMPSpring dbunit 固有のアノテーション (@TestExecutionListenersおよび) を削除することで、なんとかデータをロードできました@DbUnitConfiguration。私はまだ使用しなければなりませんでした@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)。次に、「古い」Dbunit の方法を使用して、データをセットアップおよび分解し、データの期待値を確認しました。これは Spring-dbunit アノテーション@DatabaseSetup@DatabaseTearDownおよびほど簡潔ではありません@ExpectedDatabaseが、機能します (以下のコード スニペットを参照)。また、OracleDataTypeFactory をテスト コンテキストに保持しました。これは、TIMESTAMP データ型が Dbunit によって認識されるために不可欠です。

私が直面した問題は、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);    
    }

取り壊す:

@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);
于 2016-06-01T10:27:49.860 に答える