2017-04-21 5 views
1

Ich habe eine Klon-Methode in meiner Student Klasse und ich versuche, wenn es zu testen wie erwartet funktioniert (dob und Adresse und tief geklont und natürlich ist seicht geklont)Wie JUnit meine Klonmethode testen?

ich mit dem zweiten Teil des Codes helfen muß , ich bin nicht sicher, wie richtig zu testen, ob Adresse und dob tief geklont werden und natürlich ist flach geklonten

...

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

Sie bitte Ihre Frage richtig erklären. – Jayesh

+0

Was ist mit dem Schreiben einer equals() -Methode (natürlich nur, wenn sie auch als gleich behandelt werden sollen) – kism3t

+0

Sind Adressen- und Dob-Arrays oder andere Objekte? Wenn nicht, bin ich mir nicht sicher, ob ich verstehe, warum Sie glauben, dass eine tiefe Kopie auf sie zutrifft –

Antwort

3

Wenn Sie auf diese Weise testen möchten, sollten Sie die Methoden equals() und hashcode() überschreiben, indem Sie alle Felder angeben, die Sie klonen möchten.

Nun ist geeignet und wirksam equals() und hashcode() mit allen Feldern außer Kraft zu setzen, wenn eine elementaren Informationen eine Student Instanz identifizieren können?

Als Alternative wäre zu vergleichen, dass die Werte der Felder mit Feldaccessoren identisch sind.
Außerdem sollten Felder mit Deep-Cloning auch aktiviert werden, indem überprüft wird, dass Objekte nicht identisch sind und Felder mit flachem Klonen können einfach bestätigt werden, indem Sie überprüfen, ob Objekte identisch sind.

Man könnte es zum Beispiel so tun:

@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

Sie können mit einer Kombination aus equals und == überprüfen.

Wenn Sie einen tiefen Klon erstellen, möchten Sie ein neues Objekt haben, das dem alten entspricht. Bei einer flachen Kopie sollte das Objekt identisch sein. So könnte man wie folgt überprüfen:

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

Da equals hat true zurück (wenn es implementiert ist richtig), Sie müssen nicht prüfen equals mit flachen Klonen.

0

Ich versuche, zu testen, ob es wie erwartet funktioniert (dob und Adresse und tief geklont und natürlich ist seicht geklonte)

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

assertEquals() über die Umsetzung der equals() hängt im Student Klasse. Wenn Sie es nicht implementiert haben, geben zwei Objekte der Klasse Studentfalse zurück.

Es wird eine sinnvolle Umsetzung true zurück, wenn beide im Vergleich Student Objekte gleiches Gehalt in den Elementvariablen, unabhängig davon, ob sie die gleichen Objekte in ihnen oder Klone teilen. Dazu müssen Sie Ihre Anforderung überprüfen (auch Klon-Membervariable Inhalt) explizit überprüft, dass die Mitglieder des geklonten Student verschiedene Objekte sind:

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