【发布时间】:2013-01-07 19:37:56
【问题描述】:
我正在尝试执行对象的深层副本,然后在其中修改新对象而不更改原始对象。为了测试功能,我使用 JUnit 来确保功能正常工作。
目前的测试基本上是抄袭《质量效应3》游戏并更改当前配音演员。
游戏类
@Override
protected Object clone(){
Game obj = new Game(getTitle(), getLeadVoiceActor(), getRating());
return obj;
}
JUnit 测试
@Before
public void setUp() {
p1 = new Person("Mark", "Meer");
g1 = new Game("Mass Effect 3", p1, 5);
}
@Test
public void testClone() throws CloneNotSupportedException {
//This works
Game g2 = (Game)g1.clone();
assertEquals(g2, g1);
assertNotSame(g2, g1);
//This doesn't even though the lead voice actor is now different
p1 = g1.getLeadVoiceActor();
p1.setFirstName("Jennifer");
p1.setLastName("Hale");
assertFalse(g2.equals(g1));
assertEquals("Jennifer Hale", g1.getLeadVoiceActor().toString());
assertEquals("Mark Meer", g2.getLeadVoiceActor().toString());
}
测试因 junit.framework.assertionfailederror 失败。
【问题讨论】:
-
问题是什么?
-
你的克隆不是深拷贝,只是浅拷贝。只做
super.clone()会产生同样的效果。 -
@madth3 我已经更正了这些错别字。 JB Nizet 我正在关注一本书,表明我所做的确实是一个深拷贝,你能确认它是错误的吗?
-
如果这本书真的是这样做的,那么这本书就是错的,是的。