【问题标题】:Deep Copy, JUnit Test Java深拷贝,JUnit 测试 Java
【发布时间】: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 我正在关注一本书,表明我所做的确实是一个深拷贝,你能确认它是错误的吗?
  • 如果这本书真的是这样做的,那么这本书就是错的,是的。

标签: java junit deep-copy


【解决方案1】:

如果你的问题是:为什么原版游戏中的人和克隆游戏中的人是一样的?,那么答案是你不是深度克隆而是浅克隆。

调用getLeadVoiceActor() 并将结果分配给克隆游戏会将引用 传递给克隆游戏的人。它不会复制任何内容。要制作副本,您需要

protected Object clone(){
    Game obj = new Game(getTitle(), (Person) getLeadVoiceActor().clone(), getRating());
    return obj;
}

protected Object clone(){
    Game obj = new Game(getTitle(), 
                        new Person(getLeadVoiceActor().getFirstName(), getLeadVoiceActor().getLastName()), 
                        getRating());
    return obj;
}

请注意,不鼓励使用 clone() 以支持复制构造函数。如果你实现克隆,那么你应该使用super.clone()

另外请注意,如果 Person 是不可变的,您就不必克隆它。

【讨论】:

  • 因为我的 getLeadVoiceActor() 只不过是一个字符串。我无法按照你的建议克隆它。
  • 怎么可能是String?你正在调用一些方法(setFirstNamesetLastName)。
  • 其实忽略我,我很傻,我才意识到我做了什么,谢谢 JB Nizet。我完全同意支持复制构造函数,但我想了解深层复制是如何实现的。
猜你喜欢
  • 1970-01-01
  • 2012-10-14
  • 2011-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 2011-03-24
相关资源
最近更新 更多