gpt4 book ai didi

oracle - dbunit 禁用 Oracle 约束

转载 作者:行者123 更新时间:2023-12-04 06:36:58 24 4
gpt4 key购买 nike

我将 DbUnit 2.4.8 与 Oracle 10g 和 JUnit 4.5 一起使用。我想在运行 DbUnit 测试时禁用 Oracle 中的外键约束,以便我可以独立于所有其他表测试单个表。这是我到目前为止:

我创建了一个扩展 DatabaseTestCase 的类 (DBUnitHelper)。我有

@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_);
}

JUnit 测试方法是:
@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");
}
}

我收到了 ORA-02291: integrity constraint violated - parent key not found error在 Junit 线上: databaseTester.onSetup(); .当我使用调试器逐步执行此操作时,我看到 DBUnitHelper.getConnection()永远不会被调用。

关于禁用 Oracle 中的约束需要修复什么的任何想法?

最佳答案

首先要问的是:“您正在处理的表上的约束是否创建为 DEFERRABLE?”

您可以通过发出以下查询来检查这一点:

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

如果约束不是作为 DEFERRABLE 创建的,则命令 SET ALL CONSTRAINTS DEFERRED 基本上没有效果。

如果约束不可延迟,您必须删除并重新创建它们作为可延迟。您不能将它们修改为可延期的。

关于oracle - dbunit 禁用 Oracle 约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4764605/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com