2

我想使用 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 不能转换为 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 看来,它似乎根本没有经过测试。有没有人有类似的问题?

4

2 回答 2

2

Oracle JDBC 驱动程序在这里没有错。

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

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

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

于 2011-01-25T08:48:02.160 回答
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>
于 2014-05-13T14:52:31.357 回答