Ошибка подтверждения с массивами
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 ответа
Вы упоминаете, что ваш тест использует 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});
}
Вам должно быть понятно, почему это так.
Вы не копируете элементы, вы просто создаете другой массив, указывающий на те же элементы. Поэтому, если ваш тестовый пример позже изменит навыки работы с массивом, вы также измените исходный массив s. Я полагаю, именно это и приводит к провалу утверждения.