2017-02-01 38 views
4

Eclipse给我一个警告,说Assert类型的方法assertEquals(Object[], Object[])已被弃用。我使用JUnit 4为什么不推荐使用来自JUnit 4的assertEquals(Object [],Object [])?

我写在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)); 
    } 
} 

谁能告诉我,为什么这种方法已经过时或什么方法我应该使用?

+2

您应该使用assertArrayEquals(Object [] expecteds,Object [] actuals)'而不是'assertEquals(Object [],Object [])''。 – alfasin

+5

“不赞成使用assertArrayEquals”我猜测它已被弃用,因为它太容易错误地调用assertEquals(Object,Object [])'。 –

+0

谢谢,没有看到那一个。 – karposhark

回答

4

由于缺乏Java类型系统的表达能力而不推荐使用。

而所有其他assertEquals方法会比较使用==(原语)或equals(引用类型)的参数,你不想为使用比较数组:所有的数组都是Object亚型(即它们是参考类型),并且不要覆盖equals,所以使用assertEquals比较数组将检查两个数组是否相同。

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

理想情况下,你就可以指定这样的参数类型:

assertEquals(T, T) 

其中T是“的Object任何亚型,除了阵列”。但是你根本无法用Java来做到这一点;即使有办法表达这样的约束,也不能阻止使用数组调用该方法,因为您始终可以将它们上传到Object s。

,你唯一可以做的事情是:

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

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

当然,这不会帮助你将数组上传到Object;但在大多数情况下,除非您真的打算调用该特定方法,否则您不会这样做。

相关问题