Java 如何测试我的克隆方法?

Java 如何测试我的克隆方法?,java,junit,cloning,Java,Junit,Cloning,我在我的学生课程中有一个克隆方法,我正在尝试测试它是否按预期工作(dob和地址,深度克隆,课程是浅克隆) 我需要第二段代码的帮助,我不知道如何正确地测试地址和dob是否是深度克隆的,当然是浅层克隆的 public void testCloning() { Student test = clone? assertEquals(Student, Student.clone()) } 如果要以这种方式进行测试,应通过指定要克隆的所有字段来覆盖equals()和hashcode

我在我的
学生
课程中有一个克隆方法,我正在尝试测试它是否按预期工作(dob和地址,深度克隆,课程是浅克隆)

我需要第二段代码的帮助,我不知道如何正确地测试地址和dob是否是深度克隆的,当然是浅层克隆的

  public void testCloning() {
    Student test = clone?
    assertEquals(Student, Student.clone())
}


如果要以这种方式进行测试,应通过指定要克隆的所有字段来覆盖
equals()
hashcode()
方法。

现在,如果更基本的信息可以识别一个
学生
实例,那么用所有字段覆盖
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()
hashcode()
方法。

现在,如果更基本的信息可以识别一个
学生
实例,那么用所有字段覆盖
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());
}

您可以使用
等于
=
的组合进行检查

进行深度克隆时,您希望有一个新对象,该对象与旧对象相等。对于浅复制,对象应相同。因此,您可以检查以下内容:

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
必须返回true(如果实现正确),因此不必使用浅克隆来检查
equals

可以使用
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
必须返回true(如果实现正确),因此不必使用浅克隆检查
equals

我试图测试它是否按预期工作(dob和地址以及深度克隆,当然是浅克隆)

assertEquals()
取决于
Student
类中
equals()
的实现。如果您没有实现它,类的任何两个对象
Student
将返回
false

如果两个比较的
Student
对象在其成员变量中具有相同的内容,则有意义的实现将返回
true
,而不管它们是否共享相同的对象或克隆。因此,您必须通过明确检查克隆的
学生的成员是否是不同的对象来检查您的需求(以及克隆成员变量内容):

@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...
}
我试图测试它是否按预期工作(dob和地址以及深度克隆,当然是浅克隆)

assertEquals()
取决于
Student
类中
equals()
的实现。如果您没有实现它,类的任何两个对象
Student
将返回
false

如果两个比较的
Student
对象在其成员变量中具有相同的内容,则有意义的实现将返回
true
,而不管它们是否共享相同的对象或克隆。因此,您必须通过明确检查克隆的
学生的成员是否是不同的对象来检查您的需求(以及克隆成员变量内容):

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

请正确解释你的问题。写一个equals()方法(当然只有当它们也应该被视为相等时)是地址和dob数组还是其他对象呢?如果没有,我不确定我是否理解为什么你认为深度副本适用于它们请正确解释你的问题。写一个equals()方法(当然只有当它们也应该被视为相等时)是地址和dob数组还是其他对象呢?如果不是,我不确定我是否理解为什么你认为深度复制适用于他们