简体   繁体   中英

NoSuchTableException in DbUnit Oracle

I am trying to use dbunit with oracle and have a test case as below. When I try to run the below code it gives me. I am not sure where am i wrong here. Can someone please help

org.dbunit.dataset.NoSuchTableException: INVOICE_STATUS_TYPE at org.dbunit.database.DatabaseDataSet.getTableMetaData(DatabaseDataSet.java:278) at org.dbunit.operation.DeleteAllOperation.execute(DeleteAllOperation.java:109) at org.dbunit.operation.CompositeOperation.execute(CompositeOperation.java:79)

import junit.framework.Assert;
import org.dbunit.DBTestCase;
import org.dbunit.PropertiesBasedJdbcDatabaseTester;
import org.dbunit.database.DatabaseConfig;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.junit.Test;


public class MyTest extends DBTestCase{

private FlatXmlDataSet loadedDataSet;
public MyTest() {

    super();
    System.out.println("TEST TEST");
    System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS, "oracle.jdbc.OracleDriver" );
    System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL, "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=vp1.qa.nsc.com)(PORT=2186))(CONNECT_DATA=(SERVICE_NAME=FADBBD1E)))" );
    System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME, "nscdba" );
    System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD, "dscdbapwd" );
    System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_SCHEMA, "INVOICE" );
}


@Override
protected IDataSet getDataSet() throws Exception {

    //return new FlatXmlDataSetBuilder().build(new FileInputStream("dataset.xml"));

    loadedDataSet = new FlatXmlDataSet(this.getClass().getClassLoader().getResourceAsStream("dataset.xml"));
    System.out.println(loadedDataSet.getTableNames().length);
    return loadedDataSet;
}

@Test
public void testStatus() {
    System.out.println("Hey...");
    Assert.assertTrue( true );
}

protected void setUpDatabaseConfig(DatabaseConfig config) {
    config.setProperty( DatabaseConfig.FEATURE_QUALIFIED_TABLE_NAMES, true );
}
}

With Oracle, ensure that DB credentials are all in UPPER CASE, ie:

System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME, "MYUSERNAME" );
System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD, "MYPASSWORD" );
System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_SCHEMA, "INVOICE" );

Where do you invoke "org.dbunit.operation.DeleteAllOperation.execute()" ?

If the table does exist, take a look at how you get the dbunit connection.

private IDatabaseConnection getConnectionUsing(Connection con,
        String username) throws SQLException, DatabaseUnitException {
    // oracle schema name is the user name
    IDatabaseConnection connection = new DatabaseConnection(con,
            username.toUpperCase());
    DatabaseConfig config = connection.getConfig();
    // oracle 10g
    config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY,
            new Oracle10DataTypeFactory());
    // receycle bin
    config.setProperty(
            DatabaseConfig.FEATURE_SKIP_ORACLE_RECYCLEBIN_TABLES,
            Boolean.TRUE);
    return connection;
}

private IDatabaseConnection getConnectionUsing(Connection con)
        throws DatabaseUnitException {
    return new DatabaseConnection(con);
}

If you run tests against oracle, the db username need to be offered as schema name. If you run tests against hsqldb, do not offer username.

Hope this helps.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM