0
Public class Person {
    private Skill[] skills;

    public Skill[] getSkills() {
        return skills;
    }

    public void setSkills(Skill[] s) {
        if (s!= null) {
            skills = new Skill[s.length];

            for (int i = 0; i < s.length; i++) {
                skills[i] = s[i];
            }
        }
    }
}
}

假设有一个类skill。问题是在 Junit 中有一个测试用例来测试方法 setSkill ugiving s = 技能数组本身。这个测试用例返回Assertion error告诉我The returned skill array should be the same,当我更改getSkill为两个数组提供相同的引用时,测试用例通过了。

有人可以帮我吗?如何复制元素而不是参考?为什么测试用例会失败?

测试用例是:

@Test(timeout = 1000) 
public void testGetSkills() { 
    instance.setSkills(skills); 
    assertSame("The returned skill array should be the same", instance.getSkills(), skills); 
}
4

2 回答 2

1

您提到您的测试用例使用assertSame. 这寻找引用相等,并要求a == b.

您的代码会创建一个副本。副本永远不会与原始副本具有引用相等性。在某些覆盖该Object方法的类中,Equals它可能assertEquals会通过。如果是数组,请尝试使用assertArrayEquals.

例如这个测试应该通过:

@Test
public void assertArrayEqualsTest() throws Exception {
  assertArrayEquals(new int[]{1, 2, 3}, new int[]{1, 2, 3});
}

但是这个测试会失败:

@Test
public void assertSameTest() throws Exception {
  assertSame(new int[]{1, 2, 3}, new int[]{1, 2, 3});
}

你应该清楚为什么会这样。

于 2013-03-08T13:03:49.367 回答
0

您不是在复制元素,您只需创建另一个指向相同元素的数组。所以如果你的测试用例后来修改了数组技能,你也会修改原来的数组s。我想这就是导致断言失败的原因。

于 2013-03-08T12:49:14.597 回答