3

JUnitを使用してテストしているマージソート関数があります。以下は私のテストケースの1つです。

@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、テストは合格します。

2つのことのいずれかが起こっていると思いました:assertArrayEquals要素の順序を気にしない(ありそうもない)か、コピーTestArray先の場合は参照によるコピーでcorrectArrayあるため、呼び出しも並べ替えです。Arrays.sortcorrectArrayTestArray

誰かが2つのどちらが起こっているかを確認できますか、そして解決策は何ですか?順序を念頭に置いているものはAssertありますか、または明示的なforループを記述せずに、参照ではなく値で配列をコピーする方法はありますか?

4

1 に答える 1

7

問題はここにあります:

Integer[] correctArray = TestArray;

配列の内容ではなく、配列への参照をコピーしています。

修正するには、その行を次のように変更します。

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