如何在写单元测试时验证对象属性

时间:2011-08-16 07:29:54

标签: java unit-testing junit dbunit

    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)

4 个答案:

答案 0 :(得分:2)

  

我应该验证这个对象的每个属性吗?

是的,你应该。否则,您将部分验证对象的状态,可能导致未验证属性的未指定数据。

  

测试此类数据访问操作的最佳方法是什么(我目前正在使用dbunit)

断言实际数据集/表格内容与预定数据集/表格内容的相等性。 how-to guide of DbUnit中介绍了这一点。这对涉及INSERTDELETEUPDATE的变更操作有意义。

对于SELECT操作,您可以断言实际对象和预期对象中的值,或者将对象的属性读取到Map中,并将其与预期的Map进行比较。如果您已实现equals()(和hashcode())来考虑所有对象属性,则assertEquals()应足以验证对象是否相等。如果您尚未实现equals()以考虑所有对象的属性是否相等,则可以使用assertThat()方法,使用自定义匹配器来验证对象属性是否相等。

此外,如果您有多个此类测试具有DAO操作的已知输入集和DAO操作后的预期数据集/表内容,则可以考虑parameterizing the tests,以便仅定义测试序列一次,但是测试是使用不同的输入多次执行的,并且系统被声明为具有不同的预期输出。

答案 1 :(得分:1)

关于预期对象和检索对象的

assertEquals应该可以正常工作。 (我认为这需要你恰当地覆盖equals方法。)

答案 2 :(得分:0)

从数据库中测试选择操作可能是有益的,特别是如果涉及某些orm或复杂的选择查询。

我相信你主要关注的是确保当你改变这个类时,如果数据库映射仍然没有问题,它将不会破坏你的单元测试。您可以实现非常通用的字段比较机制(如所有字段上的自定义equals方法)或使用现有的一个 - 例如来自Apache Commons的EqualsBuilder.reflectionEquals

答案 3 :(得分:0)

如果您觉得存在忘记加载其中一个属性或替换其中两个属性的风险,那么一定要对其进行测试。

如果您认为它永远不会发生,请不要对其进行测试,并等待发生错误。如果发生这种情况,请引入由于此错误而失败的单元测试,修复错误,并验证单元测试不再失败。

简而言之:没有绝对的规则,由你来决定