2011-01-21 2 views
2

J'utilise DbUnit 2.4.8 avec Oracle 10g et JUnit 4.5. Je voudrais désactiver les contraintes de clé étrangère dans Oracle tout en exécutant les tests DbUnit que j'ai pour pouvoir tester des tables uniques indépendantes de toutes les autres tables. C'est ce que j'ai pour le moment:dbunit disable Contrainte Oracle

J'ai créé une classe (DBUnitHelper) qui étend DatabaseTestCase. J'ai

@Override 
protected IDatabaseConnection getConnection() throws Exception { 

    if (usingInternalCtx_) 
    { 
     if (!esa.util.SysConfig.isRunning()) 
      esa.util.SysConfig.startupSystem(); 

     ctx_ = OraPool.getCtx(); 
    } 

    //disable foreign keys 
    Connection con = ctx_.getConnection(); 
    con.prepareStatement("SET CONSTRAINTS ALL DEFERRED").execute(); 

    return new OracleConnection(con, "my_schema"); // DatabaseConnection(con_); 
} 

La méthode de test JUnit est:

@Test 
public void useDatabaseTesterToRemoveExistingDataThenRunTest() 
{ 
    IDataSet dataset = null; 

    try 
    { 
     IDatabaseTester databaseTester = dbunit_.getDatabaseTester(); 
     databaseTester.setDataSet(dbunit_.getDataSet()); 
     databaseTester.onSetup(); // clean out existing entries in the table specified by the dataset and populate it with entries from the database 

     IDataSet databaseDataSet = databaseTester.getDataSet(); 
     // IDataSet databaseDataSet = con.createDataSet(); // uncomment to retrieve actual rows from the database 
     ITable actualTable = databaseDataSet.getTable(TABLE_NAME); 

     // Load expected data from an XML dataset 
     IDataSet expectedDataSet = dbunit_.getDataSet(); 
     ITable expectedTable = expectedDataSet.getTable(TABLE_NAME); 

     // Assert new testing database table match expected (xml) table 
     assertEquals(3,expectedTable.getRowCount()); 
     assertEquals(expectedTable.getRowCount(), actualTable.getRowCount()); 
     assertEquals(expectedTable.getValue(1, "oid"), actualTable.getValue(1, "oid")); 
     Assertion.assertEquals(expectedTable, actualTable); 

     databaseTester.onTearDown(); // by default does nothing 
    } catch (Exception e) 
    { 
     e.printStackTrace(); 
     fail("test_names has problems"); 
    } 
} 

je reçois un ORA-02291: integrity constraint violated - parent key not found error sur la ligne de Junit: databaseTester.onSetup();. Lorsque je passe à travers cela avec le débogueur, je vois que le DBUnitHelper.getConnection() n'est jamais appelé.

Des idées sur ce que je dois corriger pour désactiver les contraintes dans Oracle?

+0

Voir http://stackoverflow.com/questions/128623/disable-all-table-constraints-in-oracle/131595#131595 –

Répondre

3

La première chose à demander est: "Les contraintes sur les tables sur lesquelles vous travaillez ont-elles été créées comme DEFERRABLE?"

Vous pouvez vérifier cela en émettant cette requête:

SELECT constraint_name, table_name, DEFERRABLE 
    FROM all_constraints 
WHERE owner = 'myschema' 
    AND table_name = 'THE_TABLE'; 

Si les contraintes ne sont pas créés DEFERRABLE, la commande SET ALL CONTRAINTES DIFFÉRÉE a essentiellement aucun effet.

Si les contraintes ne peuvent pas être reportées, vous devez les supprimer et les recréer comme étant différées. Vous ne pouvez pas les modifier pour être reportables.