1
1
package com.baeldung.cloningobject
2
2
3
-
4
- import org.junit.jupiter.api.Assertions.*
3
+ import org.assertj.core.api.Assertions.assertThat
5
4
import org.junit.jupiter.api.Test
6
5
7
- data class Address (val street : String , val city : String )
6
+ data class Address (var street : String , var city : String )
8
7
9
- data class Person (val name : String , val address : Address ): Cloneable {
8
+ data class Person (var name : String , var address : Address ) : Cloneable {
10
9
public override fun clone (): Person {
11
10
return Person (name, address)
12
11
}
13
12
13
+ fun deepCopy (name : String = this.name, address : Address = this.address.copy()): Person {
14
+ return Person (name, address)
15
+ }
16
+
14
17
constructor (person: Person ) : this (person.name, person.address)
15
18
}
16
19
17
20
class CloningObjectUnitTest {
18
21
19
- private val address = Address (" Jalan Kemasan" , " Yogyakarta" )
22
+ private val address = Address (" Jln. Kemasan" , " Yogyakarta" )
20
23
private val person = Person (" Hangga" , address)
21
24
22
25
private fun serializePerson (person : Person ): String {
@@ -32,56 +35,67 @@ class CloningObjectUnitTest {
32
35
}
33
36
34
37
@Test
35
- fun `when using secondary constructor then proves that shallow copy` (){
38
+ fun `when using secondary constructor then proves that shallow copy` () {
36
39
val clonedPerson = Person (person)
37
-
38
- // original object and cloned object should have the same values
39
- assertEquals(person.name, clonedPerson.name)
40
- assertEquals(person.address, clonedPerson.address)
41
-
42
- // But they should not refer to the same object
43
- assertNotSame(person, clonedPerson)
44
- assertSame(person.address, clonedPerson.address)
40
+ clonedPerson.address.city = " Surabaya"
41
+ clonedPerson.address.street = " Jln. Ahmad Yani"
42
+ println (" clonedPerson.address.city -> " + clonedPerson.address.city)
43
+ println (" person.address.city -> " + person.address.city)
44
+ assertThat(clonedPerson).isNotSameAs(person)
45
+ assertThat(clonedPerson.address.city).isEqualTo(person.address.city)
46
+ assertThat(clonedPerson.address.street).isEqualTo(person.address.street)
45
47
}
46
48
47
49
@Test
48
50
fun `when using copy then proves that shallow copy` () {
49
51
val clonedPerson = person.copy()
50
-
51
- // original object and cloned object should have the same values
52
- assertEquals(person.name, clonedPerson.name)
53
- assertEquals(person.address, clonedPerson.address)
54
-
55
- // But they should not refer to the same object
56
- assertNotSame(person, clonedPerson)
57
- assertSame(person.address, clonedPerson.address)
52
+ clonedPerson.address.city = " Palembang"
53
+ clonedPerson.address.street = " Jln. Abi Hasan"
54
+ println (" clonedPerson.address.city -> " + clonedPerson.address.city)
55
+ println (" person.address.city -> " + person.address.city)
56
+ assertThat(clonedPerson).isNotSameAs(person)
57
+ assertThat(clonedPerson.address.city).isEqualTo(person.address.city)
58
+ assertThat(clonedPerson.address.street).isEqualTo(person.address.street)
58
59
}
59
60
60
61
@Test
61
- fun `with using clone then proves that shallow copy` (){
62
+ fun `with using clone then proves that shallow copy` () {
62
63
val clonedPerson = person.clone()
64
+ clonedPerson.address.city = " Palembang"
65
+ clonedPerson.address.street = " Jln. Abi Hasan"
66
+ println (" clonedPerson.address.street -> " + clonedPerson.address.street)
67
+ println (" person.address.street -> " + person.address.street)
68
+ assertThat(clonedPerson).isNotSameAs(person)
69
+ assertThat(clonedPerson.address.city).isEqualTo(person.address.city)
70
+ assertThat(clonedPerson.address.street).isEqualTo(person.address.street)
71
+ }
63
72
64
- // original object and cloned object should have the same values
65
- assertEquals(person.name, clonedPerson.name)
66
- assertEquals(person.address, clonedPerson.address)
67
-
68
- // But they should not refer to the same object
69
- assertNotSame(person, clonedPerson)
70
- assertSame(person.address, clonedPerson.address)
73
+ @Test
74
+ fun `with own function then proves that deep copy` () {
75
+ val clonedPerson = person.deepCopy()
76
+ clonedPerson.address.city = " Bandung"
77
+ clonedPerson.address.street = " Jln. Siliwangi"
78
+ println (" clonedPerson.address.city -> " + clonedPerson.address.city)
79
+ println (" clonedPerson.address.street -> " + clonedPerson.address.street)
80
+ println (" person.address.city -> " + person.address.city)
81
+ println (" person.address.street -> " + person.address.street)
82
+ assertThat(clonedPerson).isNotSameAs(person)
83
+ assertThat(clonedPerson.address.city).isNotEqualTo(person.address.city)
84
+ assertThat(clonedPerson.address.street).isNotEqualTo(person.address.street)
71
85
}
72
86
73
87
@Test
74
- fun `when using serialize then proves that deep copy` () {
88
+ fun `when using serialize then proves that shallow copy` () {
75
89
val serializedPerson = serializePerson(person)
76
90
val clonedPerson = deserializePerson(serializedPerson)
77
-
78
- // original object and cloned object should have the same values
79
- assertEquals(person.name, clonedPerson.name)
80
- assertEquals(person.address.street, clonedPerson.address.street)
81
- assertEquals(person.address.city, clonedPerson.address.city)
82
-
83
- // But they should not refer to the same objects
84
- assertNotSame(person, clonedPerson)
85
- assertNotSame(person.address, clonedPerson.address)
91
+ clonedPerson.address.city = " Palembang"
92
+ clonedPerson.address.street = " Jln. Abi Hasan"
93
+ println (" clonedPerson -> " + clonedPerson.address.city)
94
+ println (" person -> " + person.address.city)
95
+ assertThat(clonedPerson).isNotSameAs(person)
96
+ assertThat(clonedPerson.address.city).isNotEqualTo(person.address.city)
97
+ assertThat(clonedPerson.address.city).isNotSameAs(person.address.city)
98
+ assertThat(clonedPerson.address.street).isNotEqualTo(person.address.street)
86
99
}
100
+
87
101
}
0 commit comments