2013-03-08 5 views
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 vugiving 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

Вы можете лучше отформатировать свой код, а также опубликовать тест? – vikingsteve

+2

Я не уверен в ошибке, но почему бы вам просто не установить навыки = s вместо того, чтобы перебирать весь массив? – ddmps

+3

@ Pescis Или используйте 'System.arrayCopy()', если вам явно нужна копия. – berry120

ответ

1

Вы упомянули, что ваш тестовый пример использует assertSame. Это ищет ссылочное равенство и требует, чтобы a == b.

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

Вы должны быть ясно, почему это.

+0

Я получил это сейчас большое вам спасибо ... Я не знал, что утверждают проверки для справки, поэтому у меня была проблема в нем , еще раз спасибо :) –

+0

рад, что я мог помочь :) у документов есть список всех доступных типов утверждений http://junit.sourceforge.net/javadoc/org/junit/Assert.html –

0

Вы не копируя элементы, вы просто создаете еще один массив, указывающий на одни и те же элементы. Поэтому, если ваш тестовый пример позже изменит навыки массива, вы также измените исходный массив s. Наверное, это то, что заставляет утверждение терпеть неудачу.

+0

Я не хочу давать ту же ссылку. потому что позже в массиве s может измениться, что также изменит навыки, и я не хочу, чтобы это произошло ... и тестовый пример JUnit: @Test (timeout = 1000) \t public void testGetSkills() { \t \t экземпляр .setSkills (навыки); \t \t assertSame («Возвращаемый массив умений должен быть одним и тем же», instance.getSkills(), навыки); \t} –

+0

Вы не хотите этого, но это то, что вы делаете. Также, может быть, вы должны утверждать, что для равенства вместо того же-тождества –

+0

да, я получил это Спасибо :) –

Смежные вопросы