2017-04-21 31 views
1

我有我的Student類的克隆方法,我想測試它是否工作正常(DOB和地址和深克隆,當然是淺克隆)如何JUnit測試我的克隆方法?

我需要的代碼的第二塊幫助,我不知道如何正確地測試,如果地址和出生日期被深克隆,當然是淺克隆

...

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

請好好解釋一下你的問題。 – Jayesh

+0

寫一個equals()方法怎麼樣(當然只有當它們也應該被視爲相等時) – kism3t

+0

Address和dob數組或其他對象?如果沒有,我不確定我是否理解爲什麼您認爲深層副本適用於他們 –

回答

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

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