2012-05-23 2 views
3

У меня есть функция mergesort, которую я тестирую с помощью JUnit. Ниже один из моих тестов:JUnit утверждающие массивы равны, когда они не являются

@Test 
    //test using randomly generated numbers 
    public void MergeSortTest002() 
    { 
     long seed = System.currentTimeMillis(); 
     Random rng = new Random(seed); 
     Integer[] TestArray = new Integer[1000]; 
     int MAX_VALUE = Integer.MAX_VALUE; 

     for(int i=0; i<1000; i++) { 
      //this will generate positive and negative numbers from 
      // -MAX_VALUE/2 to +MAX_VALUE/2 
      Integer newNum = rng.nextInt(MAX_VALUE/2) - MAX_VALUE; 
      TestArray[i] = newNum; 
     } 

     Integer[] correctArray = TestArray; 
     Arrays.sort(correctArray); 
     MergeSort.mergeSort(TestArray); 

     Assert.assertArrayEquals(correctArray,TestArray); 
    } 

Странная вещь, даже если я закомментируйте строку, где я называю мою mergeSort функции, тест по-прежнему проходит.

я понял, одна из двух вещей происходит: либо assertArrayEquals не заботится о порядке элементов (маловероятно), о том, когда я копирование TestArray в correctArray, это копирование по ссылке, и, таким образом, вызывая Arrays.sort на correctArray сортирует TestArray также.

Может ли кто-нибудь подтвердить, какая из двух происходит, и каково должно быть решение? Есть ли Assert, который сохраняет порядок в памяти, или есть способ скопировать массивы по значениям, а не ссылку, не записывая явный цикл?

ответ

8

Проблема прямо здесь:

Integer[] correctArray = TestArray; 

Вы копируя ссылку в массиве, а не в содержание массива.

Чтобы исправить, изменить эту строку:

Integer[] correctArray = TestArray.clone(); 
+0

Ах, спасибо. Я понял, что это была проблема, но не имел понятия о существовании '.clone()'. – xbonez

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