2011-08-16 7 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; 

これは私が持っているオブジェクトです。
私はselect操作(mysqlからオブジェクトを選択)をテストします。
このオブジェクトの各プロパティを確認する必要がありますか?期待されるオブジェクトと、検索対象に(私は現在、DbUnitを使用しています)、このようなデータアクセス操作をテストするための最良の方法は何か
書き込みユニットテスト中にオブジェクトのプロパティを確認する方法

答えて

2

を決定するのはあなた次第です、私はこのオブジェクトの各プロパティを確認する必要がありますか?

はい、そうです。それ以外の場合は、オブジェクトの状態を部分的に検証し、検証されていないプロパティのデータが不特定になる可能性があります。

アサート実際のデータセット/テーブルの内容と予め決められたデータセット/テーブルの内容の平等のために(私は現在、DbUnitを使用しています)、このようなデータアクセス操作をテストするための最良の方法は何ですか。これはhow-to guide of DbUnitに記載されています。これは、INSERT,DELETEまたはUPDATEを含む突然変異操作には意味をなされます。

SELECT操作では、実際のオブジェクトと予想されるオブジェクトの値をアサートするか、オブジェクトのプロパティをマップに読み込んで、期待されるマップと比較することができます。 equals()(およびhashcode())を実装してすべてのオブジェクトプロパティを検討した場合は、オブジェクトが同等かどうかを確認するにはassertEquals()で十分です。 equals()を実装していない場合は、すべてのオブジェクトのプロパティが等しいかどうかを確認するには、代わりにassertThat()メソッドを使用して、カスタムマッチャーを使用してオブジェクトのプロパティが等しいかどうかを確認します。

また、DAO操作のための既知の入力セットとDAO操作後の予想されるデータセット/テーブルの内容を持つ複数のテストがある場合、テストシーケンスは1回だけ定義されるように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

属性のいずれかをロードすることを忘れたり、これらの属性のうちの2つを置き換えることを忘れてしまう可能性がある場合は、間違いなくテストしてください。

もしそれが起こらないと思うなら、それをテストしてバグが起こるのを待ってください。それが起こった場合は、このバグにより失敗したユニットテストを導入し、バグを修正し、ユニットテストがもはや失敗しないことを確認してください。要するに

:そこには絶対的なルールはありません、それは

関連する問題