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)
有人可以告诉我为什么这个方法被弃用或者我应该使用什么方法?
由于缺乏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; 但在大多数情况下,除非你真的打算调用那个特定的方法,否则你不会.