我有一个类Address,一个类AddressTest,我试图为它的构造函数和getter getter编写单元测试。
/**
* 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;
}
}/**
* 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);
}
}我做得对吗?还是有更好的方法?任何帮助都很感激。
发布于 2015-08-24 07:27:55
/**
* Constructor
*/
public Address() {
}您刚刚放弃了创建private构造函数的目的.不仅如此,还可以使用Address字段创建一个null实例。即使这在您的代码库中是可能的(如在testGetterSetterPostalCode()中使用的),那么我将建议简单地坚持两个public构造函数-一个带有参数,另一个没有。然后,public static createAddress()就变得不必要了。
我也不确定testPrivateConstructor()的可行性.单元测试应该断言类的特性的行为,而不是它的构造函数和方法的可见性。
发布于 2015-08-24 11:17:22
作为一个更一般性的评论,我想增加两段摘录,我最近读了一本书,名为“单元测试的艺术”,由罗伊奥舍罗夫。它帮助了我很多,它真的值得一读-它也有价值的问题,你的问题。
私有或受保护的方法通常是私有的,在开发人员心中有一个很好的理由。有时是为了隐藏实现细节,这样以后实现就可以更改,而不需要更改最终的功能。它也可能是出于与安全相关或与IP相关的原因(例如混淆)。当您测试私有方法时,您将针对系统内部的契约进行测试,这很可能会发生变化。内部契约是动态的,当您重构系统时,它们可以更改。当它们发生变化时,您的测试可能会失败,因为某些内部工作正在以不同的方式完成,即使系统的整体功能保持不变。出于测试目的,公共契约(总体功能)是您需要关心的全部。测试私有方法的功能可能导致中断测试,尽管总体功能是正确的。(第7.2.1节,第182页)
Osherove写道,“单元测试是一种自动代码,它调用被测试的方法或类,然后检查关于该方法或类的逻辑行为的一些假设”。逻辑代码是指具有
因此,他得出结论:
属性(Java中的getters/setters)是代码的好例子,通常不包含任何逻辑,因此不需要测试。但是要小心:一旦在属性中添加了任何检查,就需要确保正在测试逻辑。(第1.4条,第12页)
https://codereview.stackexchange.com/questions/101772
复制相似问题