我有一个正在使用 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
,它通过引用进行复制,因此在 correctArray
上调用 Arrays.sort
也是对 TestArray
进行排序。
谁能确认发生了这两种情况中的哪一种,解决方案应该是什么?是否有一个 Assert
可以记住顺序,或者是否有一种方法可以在不编写显式 for 循环的情况下按值而不是引用来复制数组?
最佳答案
问题就在这里:
Integer[] correctArray = TestArray;
您正在将引用 复制到您的数组,而不是数组的内容。
要修复,将该行更改为:
Integer[] correctArray = TestArray.clone();
关于java - JUnit 断言数组在不相等时是相等的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10727060/