Ошибка подтверждения с массивами

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. Я полагаю, именно это и приводит к провалу утверждения.

Другие вопросы по тегам