首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单元测试私有构造函数和getter setter

单元测试私有构造函数和getter setter
EN

Code Review用户
提问于 2015-08-24 07:14:30
回答 2查看 15.6K关注 0票数 5

我有一个类Address,一个类AddressTest,我试图为它的构造函数和getter getter编写单元测试。

地址:

代码语言:javascript
复制
/**
 * The bean Address.
 *
 * @author Sandeep Chatterjee
 * @since 24/8/2015
 */
class Address {

    private BigInteger addressId;

    private String name;

    private String address;

    private String contactNo;

    private String postalCode;

    /**
     * Constructor
     */
    public Address() {
    }


    /**
     * Constructor
     *
     * @param name       Addressee Name
     * @param address    Full Postal Address
     * @param contactNo  Addressee Contact Number
     * @param postalCode Addressee postal code
     */
    private Address(String name, String address, String contactNo, String postalCode) {
        this.addressId = new BigInteger(256, new Random());
        this.name = name;
        this.address = address;
        this.contactNo = contactNo;
        this.postalCode = postalCode;
    }

    /**
     * Static factory
     *
     * @param name       Addressee Name
     * @param address    Full Postal Address
     * @param contactNo  Addressee Contact Number
     * @param postalCode Addressee postal code
     * @return An Address instance
     */
    public static Address createAddress(String name, String address, String contactNo, String postalCode) {
        return new Address(name, address, contactNo, postalCode);
    }

    /* Object overrides */
    @Override
    public String toString() {
        return new ToStringBuilder(this)
                .append("address", address)
                .toString();
    }

    @Override
    public final int hashCode() {
        return Objects.hashCode(addressId);
    }

    @Override
    public final boolean equals(Object object) {
        if (object instanceof Address) {
            Address that = (Address) object;
            return Objects.equal(this.addressId, that.addressId);
        }
        return false;
    }

    /* Accessors and Mutators */

    /**
     * @return Get Address Id
     */
    public BigInteger getAddressId() {
        return addressId;
    }

    /**
     * @param addressId Set Address Id
     */
    public void setAddressId(BigInteger addressId) {
        this.addressId = addressId;
    }

    /**
     * @return Get Addressee Name
     */
    public String getName() {
        return name;
    }

    /**
     * @param name Set Addressee Name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * @return Get Full Postal Address
     */
    public String getAddress() {
        return address;
    }

    /**
     * @param address Set Full Postal Address
     */
    public void setAddress(String address) {
        this.address = address;
    }

    /**
     * @return Get Addressee Contact Number
     */
    public String getContactNo() {
        return contactNo;
    }

    /**
     * @param contactNo Set Addressee Contact Number
     */
    public void setContactNo(String contactNo) {
        this.contactNo = contactNo;
    }

    /**
     * @return Get Addressee postal code
     */
    public String getPostalCode() {
        return postalCode;
    }

    /**
     * @param postalCode Set Addressee postal code
     */
    public void setPostalCode(String postalCode) {
        this.postalCode = postalCode;
    }
}

AddressTest:

代码语言:javascript
复制
/**
 * All tests for class Address
 *
 * @author Sandeep Chatterjee
 * @since 24/8/2015
 */
public class AddressTest {

    /**
     * @see [http://www.jqno.nl/equalsverifier/]
     * @see [https://github.com/jqno/equalsverifier/blob/master/README.md]
     */
    @Test
    public void equalsContract() {
        EqualsVerifier.forClass(Address.class)
                .suppress(Warning.NONFINAL_FIELDS, Warning.NULL_FIELDS)
                .verify();
    }


    @Test
    public void testPrivateConstructor() {
        final Constructor<?>[] constructors = Address.class.getDeclaredConstructors();
        for (Constructor<?> constructor : constructors) {
            Assert.assertTrue(Modifier.isPrivate(constructor.getModifiers()));
        }
    }


    @Test
    public void testGetterSetterPostalCode() {
        final String postalCode = "456098";
        final Address address = new Address();
        address.setPostalCode("456098");
        Assert.assertEquals(address.getPostalCode(), postalCode);
    }
}

我做得对吗?还是有更好的方法?任何帮助都很感激。

EN

回答 2

Code Review用户

回答已采纳

发布于 2015-08-24 07:27:55

代码语言:javascript
复制
/**
 * Constructor
 */
public Address() {
}

您刚刚放弃了创建private构造函数的目的.不仅如此,还可以使用Address字段创建一个null实例。即使这在您的代码库中是可能的(如在testGetterSetterPostalCode()中使用的),那么我将建议简单地坚持两个public构造函数-一个带有参数,另一个没有。然后,public static createAddress()就变得不必要了。

我也不确定testPrivateConstructor()的可行性.单元测试应该断言类的特性的行为,而不是它的构造函数和方法的可见性。

票数 8
EN

Code Review用户

发布于 2015-08-24 11:17:22

作为一个更一般性的评论,我想增加两段摘录,我最近读了一本书,名为“单元测试的艺术”,由罗伊奥舍罗夫。它帮助了我很多,它真的值得一读-它也有价值的问题,你的问题。

测试私有或受保护的方法

私有或受保护的方法通常是私有的,在开发人员心中有一个很好的理由。有时是为了隐藏实现细节,这样以后实现就可以更改,而不需要更改最终的功能。它也可能是出于与安全相关或与IP相关的原因(例如混淆)。当您测试私有方法时,您将针对系统内部的契约进行测试,这很可能会发生变化。内部契约是动态的,当您重构系统时,它们可以更改。当它们发生变化时,您的测试可能会失败,因为某些内部工作正在以不同的方式完成,即使系统的整体功能保持不变。出于测试目的,公共契约(总体功能)是您需要关心的全部。测试私有方法的功能可能导致中断测试,尽管总体功能是正确的。(第7.2.1节,第182页)

测试Getters和Setters

Osherove写道,“单元测试是一种自动代码,它调用被测试的方法或类,然后检查关于该方法或类的逻辑行为的一些假设”。逻辑代码是指具有

  • IF语句
  • 一圈
  • 开关或案例陈述
  • 计算或
  • 任何其他类型的决策代码。

因此,他得出结论:

属性(Java中的getters/setters)是代码的好例子,通常不包含任何逻辑,因此不需要测试。但是要小心:一旦在属性中添加了任何检查,就需要确保正在测试逻辑。(第1.4条,第12页)

票数 7
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/101772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档