1

我需要一个想法/提示如何使用 DbUnit 来断言由数据库生成的 ID(例如 MySQL 的自动增量列)。我有一个非常简单的案例,但目前我发现有问题:

2个表:mainrelatedmain.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>

作为顺序,如何执行插入尚不清楚 - 我不能在测试之前简单地清除/截断表并提前使用预定义的 ID(例如,“ABC”条目将首先出现,因此它获得 ID 1,“DEF”作为第二个- 得到2)。如果我以这种方式编写测试 - 这将是错误的 - 运气好有时它可能会起作用,而在其他情况下则不会。

有没有一种干净的方法来测试这种情况?因为我仍然想断言条目是在 DB 中正确创建和链接的,不仅它们存在(如果我只是忽略自动增量列)。

4

2 回答 2

2

根据问题的评论,我正在回答我自己的问题,所以这可能会帮助其他人,寻找类似的解决方案。

毕竟我们确实跳过了断言生成的 ID,因为它们对我们来说并不是很有趣。我们实际上想要检查的是mainrelated表之间的条目是否“正确链接”。为了实现这一点,在我们的单元测试中,我们确实使用查询创建了数据集,连接了两个表:

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>

当数据集匹配时,我们可以假设条目“正确链接”。

于 2014-03-16T10:57:52.083 回答
0

也许您让 dbunit自动对表格main进行排序。由于绝对行数是已知的,这应该可以解决您的问题。idrelatedid

DBUnit 允许使用 org.dbunit.dataset.SortedTable.SortedTable 进行排序,这需要一个表和应该排序的列列表。SortedTable 的 JavaDoc

于 2012-11-20T06:45:07.573 回答