JUnit 如何测试我的克隆方法?
How to JUnit test my cloning method?
我的 Student
class 中有一个克隆方法,我正在尝试测试它是否按预期工作(dob 和地址以及深度克隆和课程浅克隆)
我需要有关第二段代码的帮助,我不确定如何正确测试地址和 dob 是否被深度克隆以及 course 是否被浅克隆
...
public Student clone() {
Student clone = new Student();
clone.dob = (Date) this.dob.clone();
clone.address = this.address.clone();
clone.course = this.course;
return clone;
}
...
public void testCloning() {
Student test = clone?
assertEquals(Student, Student.clone())
}
如果要以这种方式进行测试,您应该通过指定要克隆的所有字段来覆盖 equals()
和 hashcode()
方法。
现在,如果更基本的信息可以识别一个 Student
实例,用所有字段覆盖 equals()
和 hashcode()
是合适且有效的吗?
另一种方法是比较字段的值是否与字段访问器相同。
此外,深度克隆的字段也应该通过检查对象不相同来断言,而浅克隆的字段可以通过检查对象相同来简单地断言。
你可以这样做,例如:
@Test
public void cloning() {
Student original = new Student(....); //
...
Student cloned = original.clone();
// deep check
assertEquals(original.getDob(), cloned.getDob());
assertEquals(original.getAddress(), cloned.getAddress());
assertNotSame(original.getDob(), cloned.getDob());
assertNotSame(original.getAddress(), cloned.getAddress());
// shallow check
assertSame(original.getCourse(), cloned.getCourse());
}
您可以使用 equals
和 ==
的组合进行检查。
当你做深度克隆时,你想要一个新对象,它等于旧对象。使用浅拷贝,对象应该是相同的。所以,你可以检查如下:
public void testCloning() {
Student original = new Student();
//Fill in values for original
Student clone = original.clone();
assertEquals(Student, Student.clone());
//Check like this for all deep cloned values
assertTrue(student.getAddress().equals(clone.getAddress()));
assertFalse(student.getAddress() == clone.getAddress());
//Check like this for all shallow cloned values
assertTrue(student.getCourse() == clone.getCourse());
}
由于 equals
必须 return 为真(如果实施正确),您不必使用浅克隆检查 equals
。
I'm trying to test if it is working as expected (dob and address and deep cloned and course is shallow cloned)
public void testCloning() {
Student test = clone?
assertEquals(Student, Student.clone())
}
assertEquals()
取决于 equals()
在 Student
class 中的实现。如果您没有实现它,class Student
的任何两个对象将 return false
.
一个有意义的实现将 return true
如果两个比较 Student
对象在它们的成员变量中具有相同的内容,无论它们是否共享 相同 中的对象或克隆。因此,您必须通过显式检查克隆 Student
的成员是否是不同的对象来检查您的要求(以及克隆成员变量内容):
@Test
public void cloneCreatesDeepCopy() {
// arrange
Student original = new Student(/*any properties*/);
// act
Student cloned = original.clone();
// assert
assertEquals("a clone should be equal to its original" ,original , cloned );
assertEquals("name is equal" ,original.getName() , cloned.getName() );
assertFalse("Name is a different string object", original.getName() == cloned.getName());
assertEquals("last name is equal" ,original.getLastName() , cloned.getLastName() );
assertFalse("last Name is a different string object", original.getLastName() == cloned.getLastName());
// and so on...
}
我的 Student
class 中有一个克隆方法,我正在尝试测试它是否按预期工作(dob 和地址以及深度克隆和课程浅克隆)
我需要有关第二段代码的帮助,我不确定如何正确测试地址和 dob 是否被深度克隆以及 course 是否被浅克隆
...
public Student clone() {
Student clone = new Student();
clone.dob = (Date) this.dob.clone();
clone.address = this.address.clone();
clone.course = this.course;
return clone;
}
...
public void testCloning() {
Student test = clone?
assertEquals(Student, Student.clone())
}
如果要以这种方式进行测试,您应该通过指定要克隆的所有字段来覆盖 equals()
和 hashcode()
方法。
现在,如果更基本的信息可以识别一个 Student
实例,用所有字段覆盖 equals()
和 hashcode()
是合适且有效的吗?
另一种方法是比较字段的值是否与字段访问器相同。
此外,深度克隆的字段也应该通过检查对象不相同来断言,而浅克隆的字段可以通过检查对象相同来简单地断言。
你可以这样做,例如:
@Test
public void cloning() {
Student original = new Student(....); //
...
Student cloned = original.clone();
// deep check
assertEquals(original.getDob(), cloned.getDob());
assertEquals(original.getAddress(), cloned.getAddress());
assertNotSame(original.getDob(), cloned.getDob());
assertNotSame(original.getAddress(), cloned.getAddress());
// shallow check
assertSame(original.getCourse(), cloned.getCourse());
}
您可以使用 equals
和 ==
的组合进行检查。
当你做深度克隆时,你想要一个新对象,它等于旧对象。使用浅拷贝,对象应该是相同的。所以,你可以检查如下:
public void testCloning() {
Student original = new Student();
//Fill in values for original
Student clone = original.clone();
assertEquals(Student, Student.clone());
//Check like this for all deep cloned values
assertTrue(student.getAddress().equals(clone.getAddress()));
assertFalse(student.getAddress() == clone.getAddress());
//Check like this for all shallow cloned values
assertTrue(student.getCourse() == clone.getCourse());
}
由于 equals
必须 return 为真(如果实施正确),您不必使用浅克隆检查 equals
。
I'm trying to test if it is working as expected (dob and address and deep cloned and course is shallow cloned)
public void testCloning() { Student test = clone? assertEquals(Student, Student.clone()) }
assertEquals()
取决于 equals()
在 Student
class 中的实现。如果您没有实现它,class Student
的任何两个对象将 return false
.
一个有意义的实现将 return true
如果两个比较 Student
对象在它们的成员变量中具有相同的内容,无论它们是否共享 相同 中的对象或克隆。因此,您必须通过显式检查克隆 Student
的成员是否是不同的对象来检查您的要求(以及克隆成员变量内容):
@Test
public void cloneCreatesDeepCopy() {
// arrange
Student original = new Student(/*any properties*/);
// act
Student cloned = original.clone();
// assert
assertEquals("a clone should be equal to its original" ,original , cloned );
assertEquals("name is equal" ,original.getName() , cloned.getName() );
assertFalse("Name is a different string object", original.getName() == cloned.getName());
assertEquals("last name is equal" ,original.getLastName() , cloned.getLastName() );
assertFalse("last Name is a different string object", original.getLastName() == cloned.getLastName());
// and so on...
}