3

我有一个正在使用 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记住顺序的方法,或者有没有一种方法可以在不编写显式 for 循环的情况下按值复制数组而不是引用?

4

1 回答 1

7

问题就在这里:

Integer[] correctArray = TestArray;

您正在复制对数组的引用,而不是数组的内容

要修复,将该行更改为:

Integer[] correctArray = TestArray.clone();
于 2012-05-23T20:09:21.810 回答