junit - 在表上打开 IDENTITY_INSERT 以使用 DB 单元加载它

标签 junit sybase dbunit identity-column identity-insert

我尝试使用 DB 单元加载一个具有标识列的表。我希望能够自己设置 id 值(我不希望数据库为我生成它)。

这是我的表的最小定义

create table X (
 id numeric(10,0) IDENTITY PRIMARY KEY NOT NULL
)

要在 X 中插入一行,我执行以下 SQL
set INDENTITY_INSERT X ON
insert into X(id) VALUES(666)

没问题。但是当我尝试使用以下数据库单元 XML 数据集 (RS_7_10_minimal_ini.xml) 加载此表时
<dataset>
 <X id="666"/>
</dataset>

使用以下最小的 JUnit (DBTestCase) 测试用例:
package lms.lp.functionnal_config;

import java.io.FileInputStream;
import org.dbunit.DBTestCase;
import org.dbunit.PropertiesBasedJdbcDatabaseTester;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSetBuilder;
import lms.DBUnitConfig;
import org.junit.Test;

public class SampleTest extends DBTestCase

{

public SampleTest(String name)

{
    super( name );
    System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS, DBUnitConfig.DBUNIT_DRIVER_CLASS );
    System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL, DBUnitConfig.DBUNIT_CONNECTION_URL );
    System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME, DBUnitConfig.DBUNIT_USERNAME );
    System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD, DBUnitConfig.DBUNIT_PASSWORD );

}

protected IDataSet getDataSet() throws Exception

{
    return new FlatXmlDataSetBuilder().build(new FileInputStream("src/test/resources/RS_7_10_minimal_ini.xml"));
}


@Test
public void testXXX() {
        // ...
}
}

它失败,但出现以下异常
com.sybase.jdbc3.jdbc.SybSQLException: Explicit value specified for identity field in table 'X' when 'SET IDENTITY_INSERT' is OFF.

在插入指定了标识列值的行之前,DB 单元似乎没有打开标识。

我已经尝试在从 JdbcDataBaseTester 检索到的连接上执行自己,但没有运气。可能是一个新连接或与用于将数据推送到 de DB 的连接不同。

任何的想法?

非常感谢大家的帮助!

Octave

最佳答案

是的,实际上在 DBUnit FAQ 中找到了解决方案

Can I use DbUnit with IDENTITY or auto-increment columns?

Many RDBMSes allow IDENTITY and auto-increment columns to be implicitly overwritten with client values. DbUnit can be used with these RDBMS natively. Some databases, like MS SQL Server and Sybase, need to explicitly activate client values writing. The way to activate this feature is vendor-specific. DbUnit provides this functionality for MS SQL Server with the InsertIdentityOperation class.



虽然它是为 MS SQL Server 编写的,但也适用于 Sybase。所以我将我的数据集推送到数据库
    new InsertIndentityOperation(DatabaseOperation.CLEAN_INSERT).execute(connection,initialDataSet); 

等等。

感谢您的回答 rawheiser。

关于junit - 在表上打开 IDENTITY_INSERT 以使用 DB 单元加载它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4205644/

相关文章:

c# - 为什么 GUID uniqueidentifier 显示值略有不同

java - DBUnit 测试比较失败

java - DBUnit 没有在每个方法之后清理和插入数据库,所以测试不是独立的

spring - DbUnit 检查自动生成 id

eclipse - 为从 Eclipse 运行的所有 JUnit 测试指定自定义 log4j.properties 文件

java - 如何在 Spring Boot 中为 Controller 编写单元测试

php - Sybase 扩展不起作用

database - Sybase bcp 错误

unit-testing - GWT 测试用例运行失败 : JUnitFatalLaunchException

java - 如何使用 Mockito 和 JUnit 定义通过链依赖调用的方法的行为?