DBUnit和Oracle JDBC(ClassCastException)

时间:2011-01-25 08:37:49

标签: java oracle jdbc dbunit

我想使用dbunit将我的测试数据库转储到原始xml文件中,并且我得到了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,commons-dbcp-1.2.2.jar和dbunit-2.4.7.jar。

这是oracle jdbc中的错误吗? 在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 ...
    }
...
}

它看起来像是oracle问题,而且从javadoc来看似乎根本没有测试过。 有没有人有类似的问题?

2 个答案:

答案 0 :(得分:2)

这里没有Oracle JDBC驱动程序。

看起来DBUnit假设它可以将ResultSet强制转换为特定于Oracle的类型。这首先是一个坏主意(但在某些情况下无法避免)。

由于您正在使用连接池,因此DbUnit实际上无法访问特定于Oracle的对象,而是访问池提供的包装器。

要么停止使用池进行测试,要么从池连接中获取底层连接并将其传递给DBUnit(这可能会导致DBUnit关闭物理连接,这是池试图通过仅提供包装器来避免的)。

答案 1 :(得分: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>