DBUnit и Oracle JDBC (ClassCastException) - PullRequest
2 голосов
/ 25 января 2011

Я хочу вывести свою тестовую базу данных в необработанный XML-файл, используя dbunit, и я получаю 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 ...
    }
...
}

Похоже на проблему с оракулом, а из javadoc кажется, что она вообще не тестировалась. У кого-нибудь была подобная проблема?

Ответы [ 2 ]

2 голосов
/ 25 января 2011

Драйвер Oracle JDBC здесь не виноват.

Похоже, DBUnit предполагает, что он может привести ResultSet к типу, специфичному для Oracle. Во-первых, это плохая идея (но в некоторых случаях ее нельзя избежать).

Поскольку вы используете пул соединений, DbUnit на самом деле не получает доступ к объекту, специфичному для Oracle, а к оболочке, предоставляемой пулом.

Либо прекратите использование пула для тестов, либо получите базовое соединение из пулированного соединения и передайте его DBUnit (это рискует, что DBUnit закрывает физическое соединение, чего пул пытается избежать, предоставляя только оболочку).

0 голосов
/ 13 мая 2014

Другой вариант - «Не использовать Apache DBCP». Вместо Apache используйте Oracle Datasource

<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>
...