为什么JUnit 4中的assertEquals(Object [],Object [])已弃用?

时间:2017-02-01 19:04:42

标签: java junit assert

Eclipse向我发出警告,指出类型assertEquals(Object[], Object[])中的方法Assert已弃用。我正在使用JUnit 4。

我在Eclipse中编写了以下代码:

import org.junit.Test;
import org.junit.Assert;

public class Generics { 
    public <T> T[] genericArraySwap(T[] list, int pos1, int pos2) throws IndexOutOfBoundsException {
        ...
    }

    @Test
    public void genericArraySwapTest() {
        Integer[] IntegerList = {0, 1, 2, 3, 4};        
        Assert.assertEquals(new Integer[] {0, 1, 2, 4, 3}, genericArraySwap(IntegerList, 3, 4));
    }
}

有人可以告诉我为什么不推荐使用这种方法或者我应该使用哪种方法?

1 个答案:

答案 0 :(得分:9)

由于缺乏Java类型系统的表现力,它已被弃用。

尽管所有其他assertEquals方法都会使用==(对于基元)或equals(对于参考类型)比较参数,但您不想使用其中任何一种比较数组:所有数组都是Object的子类型(即它们是引用类型),并且不要覆盖equals,因此使用assertEquals来比较数组将检查两者是否相同数组是相同的。

相反,您应该调用assertArrayEquals,它会比较数组是否具有相同的长度,如果是,则相应的数组元素是否相等。

理想情况下,您可以像这样指定参数类型:

assertEquals(T, T)

其中T是&#34; Object的任何子类型,除了数组&#34;。但你根本无法用Java做到这一点;即使有办法表达这样的约束,你也不能阻止用数组调用该方法,因为你总是可以将它们向上转换为Object

你唯一能做的就是:

  • 提供接受Object s
  • 的重载
  • 提供接受更多特定类型的重载,并标记这些重载@Deprecated。要覆盖所有数组类型,您需要9个重载(每个基本数组类型为8个; Object[]为1个,包含所有其他引用类型。)

这并不会阻止您调用assertEquals(T[], T[]),但它会通过编译器警告突出显示存在问题; Eclipse中的黄色波浪形;等

当然,如果您将阵列转换为Object,这将无济于事;但在大多数情况下,除非你真的打算调用那个特定的方法,否则你不会。