我想使用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来看似乎根本没有测试过。 有没有人有类似的问题?
答案 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>