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...
}