2011-01-25 13 views
2

dbunitを使用してテスト用のdbをraw xmlファイルにダンプしたい場合、ClassCastExceptionが発生します。結果としてDBUnitとOracle JDBC(ClassCastException)

new FlatXmlWriter(new FileOutputStream("expected_ds.xml")). 
     write(getDbunitConnection().createDataSet(new String[]{"TAB1","TAB2"})); 

と::

 
    java.lang.ClassCastException: org.apache.commons.dbcp.DelegatingResultSet cannot be cast to oracle.jdbc.OracleResultSet 

私は、コモンズ-DBCP-1.2.2.jarはとDbUnitを-2.4をojdbc14-10.2.0.3.0.jar使用しているコードの下.7.jar。

これはoracle jdbcのバグですか? はojdbcドライバでは、私はそのようSTHを発見した:

/** 
* 
* TODO UnitTests are completely missing 
* @author Phil Barr 
* @author Last changed by: $Author: jbhurst $ 
* @version $Revision: 1072 $ $Date: 2009-10-12 19:46:45 +0200 (lun, 12 ott 2009) $ 
* @since 2.4.0 
*/ 
public class OracleXMLTypeDataType extends BlobDataType 
{ 

    public Object getSqlValue(int column, ResultSet resultSet) throws SQLException,  TypeCastException 
    { 
     byte[] data = new byte[0]; 
     OracleResultSet oracleResultSet = (OracleResultSet) resultSet; 
     ... some other stuf ... 
    } 
... 
} 

はそれは、Oracleの問題のように見えるとのjavadocから、それがすべてでテストされていなかったようです。 誰も似たような問題を抱えていますか?

答えて

2

ここでは、Oracle JDBCドライバに問題がありません。

DBUnitは、ResultSetをOracle固有の型にキャストできると仮定しているようです。それは最初は悪い考えです(しかし、場合によっては避けることはできません)。

接続プールを使用しているため、DbUnitは実際にはOracle固有のオブジェクトにアクセスするのではなく、プールによって提供されるラッパーにアクセスします。

テスト用のプールの使用を停止するか、プールされた接続から基本接続を取得してDBUnitに渡します(これにより、DBUnitは物理接続を閉じます。これは、プールがラッパーを提供するだけで回避しようとします) 。

+0

はいこれはdbunitの前提です –

0

もう1つのオプションは、「Apache DBCPを使用しない」です。 Apacheの代わりにOracleデータソースを使用する

<bean id="dataSource" class="oracle.jdbc.pool.OracleDataSource" destroy-method="close"> 
     <property name="URL" value="${test.db.url}" /> 
     <property name="user" value="${test.db.username}"/> 
     <property name="password" value="${test.db.password}"/> 
     <property name="connectionCachingEnabled" value="true"/> 
</bean>