DBUnit Sybase не может CLEAN_INSERT - PullRequest
       11

DBUnit Sybase не может CLEAN_INSERT

2 голосов
/ 21 ноября 2011

Согласно DBUnit docs ссылка должна поддерживать CLEAN_INSERT при использовании DatabaseSequenceFilter.

Я получаю следующее исключение при попытке этого

com.sybase.jdbc2.jdbc.SybSQLException: Dependent foreign key constraint violation in a referential integrity constraint. dbname =  'my_db', table name = 'tbl_child', constraint name = 'fk_tbl_child_parentid'.

Мои таблицы выглядят так:

CREATE TABLE dbo.tbl_parent
(
    parent_id            numeric(19,0) IDENTITY,
    ...
)

CREATE TABLE dbo.tbl_child
(
    child_id            numeric(19,0) IDENTITY,
    parent_id           numeric(19,0) NOT NULL,
    ...
)

ALTER TABLE dbo.tbl_child
    ADD CONSTRAINT fk_tbl_child_parentid
    FOREIGN KEY (parent_id)
    REFERENCES dbo.tbl_parent (parent_id)

И мой набор данных DBUnit выглядит так:

<dataset>
  <tbl_parent parent_id="41" ... />

  <tbl_child child_id="1361" parent_id="41"/>
</dataset>

Таким образом, в моем тестовом классе, где у меня есть этот код, я получаю сообщение об ошибке, если данные уже существуют в базе данных и их нельзя удалить из-за ограничений внешнего ключа

@Before 
public void setUp() throws Exception {
    InsertIdentityOperation.CLEAN_INSERT.execute(getConnection(), getDataSet());
}

Интересно, что обходной путь - использовать REFRESH вместо CLEAN_INSERT, но это далеко не идеально, поскольку нежелательные данные могут находиться в базе данных, вызывая побочные эффекты:

@Before 
public void setUp() throws Exception {
    InsertIdentityOperation.REFRESH.execute(getConnection(), getDataSet());
}

Кто-нибудь смог заставить этот CLEAN_INSERT работать с Sybase и внешними ключами? Из прочтения других постов аналогичные проблемы существуют для MySQL, поэтому, возможно, здесь есть общая проблема (или я чего-то не понимаю)

[EDIT]

Теперь я добавил свой собственный обходной путь после повторного появления той же проблемы.

Я использую Sybase ASE 15 + DBUnit 2.4.8

Ответы [ 2 ]

2 голосов
/ 14 мая 2012

Я пришел к выводу, что это действительно проблема с Sybase + DBUnit после устранения тех же проблем в другом проекте (хотя я использую те же версии файлов JAR и сервер базы данных).

Обходной путь, на котором я наконец остановился, был следующий

@Before 
public void setUp() throws Exception {
    InsertIdentityOperation.TRUNCATE_TABLE.execute(getConnection(), getDataSet());
    InsertIdentityOperation.INSERT.execute(getConnection(), getDataSet());
}

Предостережение заключается в том, что TRUNCATE, очевидно, уничтожит все данные в таблицах базы данных при запуске теста, но я могу с этим смириться. По крайней мере, я точно знаю, какие данные находятся в базе данных, и мои тесты с меньшей вероятностью не пройдут из-за ошибочных записей, вставленных другими разработчиками, работающими между выполнениями теста. Вероятно, это хорошая причина, почему вам нужна выделенная база данных для модульных и интеграционных тестов.

0 голосов
/ 30 января 2012

Просто используйте INSERT Операция для вставки значений через XML или DataSet. XML или сценарий вставки должны вставлять данные в порядке, то есть сначала в родительский, а затем в дочерний, используйте DELETE_ALL Операция удаления таблиц в обратном порядке.

protected DatabaseOperation getSetUpOperation() throws Exception
    {
        return DatabaseOperation.INSERT;

    }

    protected DatabaseOperation getTearDownOperation() throws Exception
    {  
        return DatabaseOperation.DELETE_ALL;
    }
...