java - 为什么不推荐使用 JUnit 4 中的 assertEquals(Object[], Object[])?

标签 java junit assert

Eclipse 向我发出警告,指出 Assert 类型的方法 assertEquals(Object[], Object[]) 已弃用。我正在使用 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));
    }
}

谁能告诉我为什么不推荐使用这种方法,或者我应该改用什么方法?

最佳答案

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

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

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

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

assertEquals(T, T)

其中 T 是“Object 的任何子类型,数组除外”。但是您根本无法在 Java 中做到这一点;即使有一种方法可以表达这样的约束,您也无法阻止使用数组调用该方法,因为您始终可以将它们向上转换为 Object

你唯一能做的就是:

  • 提供一个接受对象的重载
  • 提供接受更具体类型的重载,并将这些重载标记为@Deprecated。要涵盖所有数组类型,您需要 9 个重载(每个原始数组类型 8 个;Object[] 1 个,它涵盖了所有其他引用类型)。

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

当然,如果您将数组向上转换为 Object,这将无济于事;但在大多数情况下,您不会这样做,除非您真的打算调用该特定方法。

关于java - 为什么不推荐使用 JUnit 4 中的 assertEquals(Object[], Object[])?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41987634/

相关文章:

java - 从选项卡获取 fragment 中适配器的位置

java - 此数据的格式名称是什么?

java - 使用@SpringBootTest时如何在测试类中 Autowiring bean

Java:用assert实现长类型溢出免疫

java - 如何用jUnit声明数据库列的Grails Controller 更新?

java - 从我的 Android 应用程序中的网页获取点击事件

java - 在其依赖项也使用相同插件的项目中使用 gradle 插件

java - Spring Boot 测试 MalformedURLException : unknown protocol: classpath

java - JUnit 测试 - 断言逻辑

python - 是否可以在Python中更改PyTest的assert语句行为