DbUnit: как утверждать сгенерированные идентификаторы

Мне нужна идея / совет, как использовать DbUnit для утверждения идентификаторов, сгенерированных базой данных (например, столбец автоинкремента MySQL). У меня очень простой случай, который на данный момент мне кажется проблематичным:

2 таблицы: main а также related, main.id столбец - автоинкремент. Связанная таблица имеет внешний ключ: related.main_id -> main.id, В моем тестовом примере мое приложение вставляет несколько записей в обе таблицы, поэтому набор данных выглядит примерно так:

<dataset>
    <main id="???" comment="ABC" />
    <main id="???" comment="DEF" />

    <related id="..." main_id="???" comment="#1 related to ABC" />
    <related id="..." main_id="???" comment="#2 related to ABC" />
    <related id="..." main_id="???" comment="#3 related to DEF" />
    <related id="..." main_id="???" comment="#4 related to DEF" />
</dataset>

Поскольку порядок выполнения вставок неясен - я не могу просто очистить / обрезать таблицу перед тестом и заранее использовать заранее определенные идентификаторы (например, сначала вводится запись "ABC", поэтому она получает идентификатор). 1 и "DEF" как 2 - получает 2). Если я напишу тест таким образом - это будет неправильно - если повезет, иногда это может сработать, а в других - нет.

Есть ли чистый способ проверки таких случаев? Поскольку я все еще хочу утверждать, что записи были созданы и правильно связаны в БД, а не только в том, что они существуют (если бы я просто игнорировал столбцы с автоинкрементом).

2 ответа

Решение

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

В конце концов мы пропустили утверждение сгенерированных идентификаторов, так как они нам не очень интересны. Что мы действительно хотели проверить, так это то, что записи между main а также related таблицы "правильно связаны". Чтобы достичь этого, в нашем модульном тесте мы создали набор данных, используя запрос, объединяя обе таблицы:

SELECT main.comment, related.comment AS related_comment 
FROM main, related 
WHERE main.id = related.main_id

Затем мы утверждаем, что набор данных, созданный этим запросом, соответствует статически определенному набору данных:

<dataset>
     <result comment="ABC" related_comment="#1 related to ABC" />
     <result comment="ABC" related_comment="#2 related to ABC" />
     <result comment="DEF" related_comment="#3 related to DEF" />
     <result comment="DEF" related_comment="#4 related to DEF" />
</dataset>

Когда наборы данных совпадают, мы можем предположить, что записи были "правильно связаны".

Может быть, вы позволите dbunit отсортировать таблицу main от id и стол related от id автоматически. Поскольку абсолютное количество строк известно в достоинствах, это должно решить вашу проблему.

DBUnit позволяет сортировать с помощью org.dbunit.dataset.SortedTable.SortedTable, для которого требуется таблица и список столбцов, которые должны быть отсортированы. JavaDoc из SortedTable

Другие вопросы по тегам