JUnit 的 assertArrayEquals() 是如何工作的?
How does JUnit's assertArrayEquals() work?
这是使用junit4的测试class。
public class TestArrayUtilities {
static final int[] ONE_D_MATRIX = { 12, 34, 45, 6, 7, 85, 67, 43 };
static final int[] ONE_D_MATRIX_REMOVED_ONE= {12, 34, 45, 6, 85, 67, 43};
removeItemWithIndex()
从具有给定索引的数组和 return 数组中删除元素。此测试非常有效。
@Test
public void testRemoveItemWithIndex(){
assertArrayEquals(ArrayUtilities.removeItemWithIndex(ONE_D_MATRIX, 4),ONE_D_MATRIX_REMOVED_ONE);}
removeSpecifiedElementInArray()
从具有指定值的数组和 return 数组中删除元素。此测试仅在明确编写时才有效。所以在这个例子中只有第二个有效。
assertArrayEquals(ArrayUtilities.removeSpecifiedElementInArray(ONE_D_MATRIX, 7), ONE_D_MATRIX_REMOVED_ONE);
assertArrayEquals(ArrayUtilities.removeSpecifiedElementInArray(new int[] { 12, 34, 45, 6, 7, 85, 67, 43 }, 7), new int[] {12, 34, 45, 6, 85, 67, 43});
JUnit 说:
java.lang.AssertionError: array lengths differed, expected.length=8 actual.length=7
这是一个错误吗?为什么第二种方法不起作用而第一种方法起作用?
This test works only if it is written expilicitly. So at this example only second one works.
assertArrayEquals(ArrayUtilities.removeSpecifiedElementInArray(ONE_D_MATRIX, 7), ONE_D_MATRIX_REMOVED_ONE);
assertArrayEquals(ArrayUtilities.removeSpecifiedElementInArray(new int[] { 12, 34, 45, 6, 7, 85, 67, 43 }, 7), new int[] {12, 34, 45, 6, 85, 67, 43});
这两个调用是相同的,因此它们应该产生相同的结果。
这个问题几乎不可避免地出现在你的测试代码中:在你的代码中的某个时刻,在调用被测试的方法之前或期间,称为 ONE_D_MATRIX
的数组发生了变异,这导致您看到的断言错误。
以下是如何验证这确实是正在发生的事情:再添加两次对 assertArrayEquals
的调用,如下所示:
assertArrayEquals(ONE_D_MATRIX, new int[] { 12, 34, 45, 6, 7, 85, 67, 43 };
int res = ArrayUtilities.removeSpecifiedElementInArray(ONE_D_MATRIX, 7);
assertArrayEquals(ONE_D_MATRIX, new int[] { 12, 34, 45, 6, 7, 85, 67, 43 };
assertArrayEquals(res, ONE_D_MATRIX_REMOVED_ONE);
在您进行实际检查之前,前两个断言中的一个会失败。
这是使用junit4的测试class。
public class TestArrayUtilities {
static final int[] ONE_D_MATRIX = { 12, 34, 45, 6, 7, 85, 67, 43 };
static final int[] ONE_D_MATRIX_REMOVED_ONE= {12, 34, 45, 6, 85, 67, 43};
removeItemWithIndex()
从具有给定索引的数组和 return 数组中删除元素。此测试非常有效。
@Test
public void testRemoveItemWithIndex(){
assertArrayEquals(ArrayUtilities.removeItemWithIndex(ONE_D_MATRIX, 4),ONE_D_MATRIX_REMOVED_ONE);}
removeSpecifiedElementInArray()
从具有指定值的数组和 return 数组中删除元素。此测试仅在明确编写时才有效。所以在这个例子中只有第二个有效。
assertArrayEquals(ArrayUtilities.removeSpecifiedElementInArray(ONE_D_MATRIX, 7), ONE_D_MATRIX_REMOVED_ONE);
assertArrayEquals(ArrayUtilities.removeSpecifiedElementInArray(new int[] { 12, 34, 45, 6, 7, 85, 67, 43 }, 7), new int[] {12, 34, 45, 6, 85, 67, 43});
JUnit 说:
java.lang.AssertionError: array lengths differed, expected.length=8 actual.length=7
这是一个错误吗?为什么第二种方法不起作用而第一种方法起作用?
This test works only if it is written expilicitly. So at this example only second one works.
assertArrayEquals(ArrayUtilities.removeSpecifiedElementInArray(ONE_D_MATRIX, 7), ONE_D_MATRIX_REMOVED_ONE);
assertArrayEquals(ArrayUtilities.removeSpecifiedElementInArray(new int[] { 12, 34, 45, 6, 7, 85, 67, 43 }, 7), new int[] {12, 34, 45, 6, 85, 67, 43});
这两个调用是相同的,因此它们应该产生相同的结果。
这个问题几乎不可避免地出现在你的测试代码中:在你的代码中的某个时刻,在调用被测试的方法之前或期间,称为 ONE_D_MATRIX
的数组发生了变异,这导致您看到的断言错误。
以下是如何验证这确实是正在发生的事情:再添加两次对 assertArrayEquals
的调用,如下所示:
assertArrayEquals(ONE_D_MATRIX, new int[] { 12, 34, 45, 6, 7, 85, 67, 43 };
int res = ArrayUtilities.removeSpecifiedElementInArray(ONE_D_MATRIX, 7);
assertArrayEquals(ONE_D_MATRIX, new int[] { 12, 34, 45, 6, 7, 85, 67, 43 };
assertArrayEquals(res, ONE_D_MATRIX_REMOVED_ONE);
在您进行实际检查之前,前两个断言中的一个会失败。