JUnit的assertArrayEquals()如何工作?

时间:2015-03-05 23:52:01

标签: java unit-testing junit

这是使用junit4的测试类。

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()从给定索引和返回数组的数组中删除元素。这个测试非常有效。

 @Test
public void testRemoveItemWithIndex(){
assertArrayEquals(ArrayUtilities.removeItemWithIndex(ONE_D_MATRIX, 4),ONE_D_MATRIX_REMOVED_ONE);}

removeSpecifiedElementInArray()从具有指定值的数组中删除元素并返回数组。此测试仅在写入expilicitly时才有效。所以在这个例子中只有第二个可以工作。

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:数组长度不同,expected.length = 8 actual.length = 7

这是一个错误吗?为什么第一种方法在第一种方法不起作用时才起作用?

1 个答案:

答案 0 :(得分:5)

  

此测试仅在写入expilicitly时才有效。所以在这个例子中只有第二个可以工作。

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);

在进行实际检查之前,前两个断言中的一个会失败。