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

时间:2017-04-21 08:47:41

标签: java junit cloning

我的Student课程中有一个克隆方法,我试图测试它是否按预期工作(dob和地址以及深度克隆和课程浅层克隆)

我需要第二块代码的帮助,我不确定如何正确测试地址和dob是否被深度克隆并且课程被浅层克隆

...

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())
}

3 个答案:

答案 0 :(得分:3)

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

现在,如果更基本的信息可以识别一个equals()个实例,那么在所有字段中覆盖hashcode()Student是否合适且有效?

另一种方法是比较字段的值与字段访问者相同 此外,还应通过检查对象是否相同来断言具有深度克隆的字段,并且可以通过检查对象是否相同来简单地断言具有浅层克隆的字段。

你可以这样做:

@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());
}

答案 1 :(得分:0)

您可以使用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

答案 2 :(得分:0)

  

我正在尝试测试它是否按预期工作(dob和地址以及深度克隆和课程浅层克隆)

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

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

如果两个比较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...
}