outside instantiation
private Title() {
}
}
这个源代码现在需要通过满足一些更具体的需求来变得更强壮、功能更完整,例如以下一些典型需求:
Person 类根据 equals(Object) 和 hashCode() 方法的合约来重写这两个方法,以便该类可以有效地用在 Collection 类型中。
Person 类实现 java.io.Serializable 接口,进行无误的序列化和反序列化。
Person 类没有被声明为 final,因此能够派生子类。
Title 类被声明为 final,因为它不公开任何构造函数(这意味着它不能派生子类)。把设计决策的采用写下来是一个良好习惯,这样就能在源代码和生成的 API 文档中看到 final 修饰符。
Title 类实现 java.io.Serializable 接口,无误地序列化和反序列化。而且序列化到同一实例(符合 Typesafe Enumeration 设计模式的要求)。
Title 类有一个 private 的默认构造函数(没有参数),防止来自外部类的实例化。
在 JUnit 测试环境中,可以容易地用 JUnitX 对所有这些需求进行断言。清单 2 中的源代码是一套 JUnit 测试用例,用 JUnitX 功能对所有需要满足的需求进行断言:
清单 2. 使用 JUnitX 断言的 JUit 测试用例
import JUnit.framework.TestCase;
import JUnitx.framework.ObjectFactory;
import JUnitx.framework.Assert;
import java.io.Serializable;
import java.lang.reflect.Constructor;
public class TestRequirements extends TestCase {
public void testPersonEqualsAndHashCodeContract() {
// Different surnames should be unequal.
ObjectFactory factory = new ObjectFactory() {
public Object createInstanceX() {
return new Person(Title.MR, "Bob", "Brown");
}
public Object createInstanceY() {
return new Person(Title.MR, "Bob", "Smith");
}
}
// Make sure the object factory meets its contract for testing.
// This contract is specified in the API documentation.
Assert.assertObjectFactoryContract(factory);
// Assert equals(Object) contract.
Assert.assertEqualsContract(factory);
// Assert hashCode() contract.
Assert.assertHashCodeContract(factory);
}
public void testPersonSerialization() {
// Assert that the Person class directly implements Serializable.
Assert.assertDirectInterfaceOf(Person.class, Serializable.class);
// Assert that the Person instance can be serialized and deserialized without errors.
Assert.assertSerializes(new Person(Title.MR, "Joe", "Blog"));
}
public void testPersonNotFinal() {
// Assert that the Person class is not declared final.
Assert.assertNotFinal(Person.class);
}
public void testTitleFinal() {
// Assert that the Title class is declared final.
Assert.assertFinal(Title.class);
}
public void testTitleSerialization() {
// Assert that the Title class directly implements Serializable.
Assert.assertDirectInterfaceOf(Person.class, Serializable.class);
// Assert that the Title instances can be serialized and deserialized without errors.
Assert.assertSerializes(Title.MR);
Assert.assertSerializes(Title.MS);
Assert.assertSerializes(Title.MRS);
// Assert that serialization results in
|