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