2012-11-19 43 views
1

我需要一個想法/提示如何使用DbUnit來聲明由數據庫生成的ID(例如MySQL的自動增量列)。我有非常簡單的情況,但目前,我發現有問題:DbUnit:如何聲明生成的ID

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中創建並正確鏈接了條目,而不僅僅是它們存在(如果我只是忽略自動增量列)。

+0

http://www.dbunit.org/faq.html#identity – Najzero

+0

@Najzero這是我認爲的問題 - 因爲它不清楚插入的順序是什麼,我不能覆蓋我的數據集中的身份,因爲他們根本不匹配,無所謂我會用......你的意思是別的嗎? – Laimoncijus

+0

@Laimoncijus,你有沒有想過如何做到這一點? –

回答

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> 

當數據集匹配時,我們可以假設,條目「正確鏈接」。

0

也許你讓dbunit自動排序你的表mainid和表relatedid自動。由於已知絕對行數有利於解決您的問題。

DBUnit的允許與org.dbunit.dataset.SortedTable.SortedTable這就需要對錶應當分類柱的側向承載力列表排序。 JavaDoc of SortedTable

+0

如果我只是對值進行排序 - 我需要跳過我期望的數據集中的ID字段(因爲它們是未知的)。在這種情況下,我斷言一切,除了主要相關的協會創建正確,所以測試不會100%正確... – Laimoncijus

+0

到100%的差異取決於如何「毫不含糊」你的數據是沒有id列。也許你的行將是\t已經明確無ID,因爲ID只是一個技術數字。 – EhmKah