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

kar*_*ark 10 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));
    }
}
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我为什么这个方法被弃用或者我应该使用什么方法?

And*_*ner 9

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

虽然所有其他assertEquals方法都会使用==(对于基元)或equals(对于引用类型)比较参数,但您不希望使用它们来比较数组:所有数组都是子类型Object(即它们是引用类型),并且不要t覆盖equals,因此使用assertEquals比较数组将检查两个数组是否相同.

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

理想情况下,您可以指定参数类型,如下所示:

assertEquals(T, T)
Run Code Online (Sandbox Code Playgroud)

其中T是" Object除数组之外的任何子类型".但是你根本无法用Java做到这一点; 即使有一种表达这种约束的方法,你也无法阻止使用数组调用该方法,因为你总是可以将它们向上转换为Objects.

你唯一能做的就是:

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

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

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