2011-01-25 71 views
2

我想使用dbunit將我的測試數據庫轉儲到原始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 

我使用ojdbc14-10.2.0.3.0.jar,公地DBCP-1.2.2.jar和DbUnit的-2.4 .7.jar。

是oracle jdbc中的一個bug嗎? 在ojdbc司機,我發現某事像那:

/** 
* 
* 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 ... 
    } 
... 
} 

它看起來像甲骨文的問題,從的Javadoc似乎它並沒有進行測試的。 有沒有人有類似的問題?

回答

2

Oracle JDBC驅動程序在這裏沒有問題。

它看起來像DBUnit假定它可以將ResultSet轉換爲Oracle特定的類型。首先這是一個壞主意(但在某些情況下不能避免)。

由於您使用的是連接池,因此DbUnit實際上不會訪問Oracle特定的對象,而是訪問池提供的包裝器。

要麼停止使用池進行測試,要麼從池連接中獲取底層連接,並將其傳遞給DBUnit(這可能會導致DBUnit關閉物理連接,這是池通過僅提供包裝而嘗試避免的情況) 。

+0

是的,你是正確的,它是dbunit假設 –

0

另一種選擇是「不要使用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>