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