【问题标题】:How to JUnit test my cloning method?如何 JUnit 测试我的克隆方法?
【发布时间】:2017-04-21 08:47:40
【问题描述】:

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

【问题讨论】:

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

标签: java junit cloning


【解决方案1】:

如果您想以这种方式进行测试,您应该通过指定要克隆的所有字段来覆盖 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());
}

【讨论】:

    【解决方案2】:

    您可以使用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 的浅克隆。

    【讨论】:

      【解决方案3】:

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

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

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

      如果两个比较的Student 对象在其成员变量中具有相同的内容,则有意义的实现将返回true,无论它们是否共享其中的相同 对象或克隆。因此,您必须通过明确检查克隆的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...
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-19
        • 2018-12-22
        • 1970-01-01
        • 2013-01-14
        • 2014-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多