2011-08-16 33 views
2
private Long itemId; 

    private String longName; 

    private String shortName; 

    private String itemUrl; 

    private Integer itemCount; 

    private Long parentCategory; 

    private Long childCategory; 

    private Integer shopType; 

    private Integer payPostage; 

    private Long originalPrice; 

    private String picUrl; 

    private Long activityPrice; 

    private String city; 

    private String itemDesc; 

    private Integer itemStatus; 

    private String itemGuarantee; 

    private Double discount; 

    private String checkComment; 

    private Long platformId; 

    private Long sellerId; 

    private String sellerNick; 

    private Integer sellerCredit; 

    private Long categoryId; 

    private Long operatorId; 

    private String operatorNick; 

    private String sellerEmail; 

    private String sellerPhone; 

    private String sellerAddress; 

    private String sellerShopUrl; 

    private String sellerRealName; 

    private String picUrlFromIC; 

    private Integer itemType; 

    private Integer tgType; 

    private String attributes; 

    private Integer isAuth = 0; 

    private String[] itemCities; 

    private Integer isBlack = 0; 

    private double lowestPirce; 

    private transient int pollNum; 

    private Integer limitNum; 

這是我的對象。
當我測試選擇操作(從mysql中選擇對象)。
我應該驗證這個對象的每個屬性?
什麼是測試這些數據訪問操作(我用的DbUnit目前)預期的對象和檢索對象如何在寫入單元測試時驗證對象屬性

回答

2

如果我確認此對象的每個屬性?

是的,你應該。否則,您會部分驗證對象的狀態,可能會導致未驗證屬性的未指定數據。

是什麼(我用的DbUnit目前)

斷言的實際數據集/表內容和預先確定的數據集/表內容平等測試這樣的數據訪問操作的最佳方式。這包括在how-to guide of DbUnit。這對於涉及INSERT,DELETEUPDATE的變異操作是有意義的。

對於SELECT操作,您可以斷言實際對象和預期對象中的值,或者將對象的屬性讀入Map中,並將其與預期的Map進行比較。如果您已實施equals()(和hashcode())以考慮所有對象屬性,則assertEquals()應足以驗證對象是否相等。如果您尚未實施equals()以考慮所有對象的屬性是否相等,則可以使用assertThat()方法,並使用自定義匹配器驗證對象屬性是否相等。

此外,如果在DAO操作之後,如果您有多個這樣的測試有一組已知的DAO操作輸入和預期的數據集/表內容,則可以考慮parameterizing the tests,以便測試序列只定義一次,但該測試在不同輸入的情況下執行多次,並且系統以不同的預期輸出斷言。

+0

聽起來很好的建議。我已經學會了如何聲明真實的數據庫內容和預定義的內容。但對於選擇操作,比較數據庫和預定義數據集沒有任何意義。我必須手動驗證對象。一些像時間戳這樣的列很難驗證 – jilen

+0

是的,對於SELECT來說沒有意義。我編輯了我的答案來解釋這種情況。 –

+0

感謝您的回答。 Item item = selectUserFromDB(); assert(item ....)沒有對象期望斷言。我應該創建一個新的只爲斷言? – jilen

1

assertEquals應該工作,我想最好的辦法。 (我認爲這需要你重寫equals方法)。

+0

我在數據集(dbunit)中定義數據庫記錄,並且從數據集創建對象並不那麼容易。 – jilen

0

從數據庫測試選擇操作,特別是如果涉及到一些ORM或複雜的選擇查詢時,可能會有所幫助。

我相信你的主要關注點是確保當你改變這個類時,如果數據庫映射仍然沒問題,它不會破壞你的單元測試。您可以實現非常通用的字段比較機制(比如所有字段上的自定義equals方法)或者使用現有的一個 - 比如Apache Commons的EqualsBuilder.reflectionEquals

0

如果您覺得有可能忘記加載其中一個屬性,或者替換其中兩個屬性,那麼必須對其進行測試。

如果您認爲它永遠不會發生,請不要測試它,並等待發生錯誤。如果發生這種情況,請引入由於此錯誤而失敗的單元測試,修復錯誤並驗證單元測試不再失敗。

簡而言之:沒有絕對的規則,它是由你來決定