数组的断言错误

时间:2013-03-08 12:39:23

标签: java arrays junit4 assertion

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

2 个答案:

答案 0 :(得分: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});
}

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

答案 1 :(得分:0)

您没有复制元素,只需创建指向相同元素的另一个数组。因此,如果稍后您的测试用例修改了数组技能,您还将修改原始数组。我想这就是导致断言失败的原因。