当前位置: 首页 > 知识库问答 >
问题:

为什么JUnit4中的assertEquals(Object[],Object[])不受欢迎?

丁宏浚
2023-03-14

Eclipse给了我一个警告,说类型Assert中的方法assertEquals(Object[],Object[])已被弃用。我正在使用JUnit4。

我在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个答案

马坚白
2023-03-14

因为Java类型系统缺乏表现力,所以不推荐使用它。

尽管所有其他的assertEquals方法都将使用=(对于原语)或equals(对于引用类型)来比较参数,但您不想使用这两种方法来比较数组:所有数组都是对象的子类型(即它们是引用类型),并且不重写equals,因此,使用assertEquals比较数组将检查这两个数组是否相同。

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

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

assertEquals(T, T)

其中,T是“除数组之外的对象的任何子类型”。但在Java中你根本无法做到这一点;即使有一种表达这种约束的方法,也无法阻止使用array调用该方法,因为您总是可以将它们上溯到Objects。

你唯一能做的就是:

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

这不会阻止您调用assertEquals(t[],t[]),但它确实通过编译器警告强调了存在问题;黄色在日食中蠕动;等

当然,如果您将数组向上投射到对象,这将不会有帮助;但在大多数情况下,除非你真的打算调用那个特定的方法,否则你不会这么做。

 类似资料:
  • 问题内容: [object Object]是JavaScript Object的默认字符串表示形式。 我会知道这是正义还是正义,但是为什么呢?为什么第一个单词是小写而第二个单词是大写?它是JSON还是JavaScript的一部分? 问题答案: 所有对象都有一个以格式显示内容的方法,其中type是对象类型。 当您在get上调用该对象时,并且在一个对象上调用该字符串时,您会得到该字符串,因为它基于Ob

  • 问题内容: 来自的javadoc : 返回此Calendar是否代表指定Object所表示的时间之前的时间。此方法等效于: 当且仅当when是Calendar实例。否则,该方法返回false。 如果有人传递的不是Calendar实例的东西返回false,为什么它接受一个Object?为什么不只接受Calendar实例呢?这使我在相当长一段时间内一直在监视功能的不正确结果。 问题答案: 我认为没有特

  • 我的代码片段如下所示 我收到的方法assertEquals(Object,Object)对于类型是不明确的。我不知道为什么我会得到它?

  • 问题内容: 我想知道为什么它是Java不允许超负荷使用,虽然他们都以不同的方式使用? 使用方式如下: 而另一种形式: 使用方式如下: 这背后有什么原因吗? 问题答案: 这个15.12.2.5选择最具体的方法对此进行了讨论,但是它相当复杂。例如,在Foo(数字…整数)和Foo(整数…整数)之间进行选择 为了向后兼容,这些实际上是同一件事。 例如,您可以将main()定义为 一种使它们与众不同的方法是

  • 问题内容: 我试图提醒函数返回的值,并且在提醒中获取了此值 [对象对象] 这是JavaScript代码 whichIsVisible是我要检查的功能 问题答案: 从对象到字符串的默认转换是。 在处理jQuery对象时,您可能想做 打印元素的ID。 如评论中所述,您应该使用Firefox或Chrome之类的浏览器中包含的工具代替来自省对象。 旁注 :ID不能以数字开头。

  • 问题内容: 换句话说,assertEquals是否与覆盖了该类的类一起使用 问题答案: 从您可以在Junit GitHub Repo上找到的assertEquals方法的源代码中: 您可以看到Junit正在使用该方法。 编辑: 该代码段来自于不推荐使用的Junit版本。 您可以在此处阅读有关“新” Junit的来源。想法基本相同,也使用了该方法。