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

在Java JUnit中检查ArrayList内容的相等性

沈宏朗
2023-03-14

我在JUnit测试中检查两个数组列表是否相等时遇到问题。当我测试两个列表是否相等时,它只检查它们的字符串表示形式是否相同。它适用于简单的示例,例如[1,2,3]、[1,2,3]或当列表包含以字符串表示的所有属性的对象时。但是当我有两个具有相同字符串表示形式但某些对象具有不同属性的列表时,我如何检查它们的相等性?

例如:

如果我有类Human的对象(int height,int weight,boolean alive),那么toString()方法是:

   public static String toString() {
        return this.height + "-" + this.weight;
   }

我有两个列表[20-30]和[20-30],但第一个列表中的对象有

 boolean alive = false 

然后在第二个

 boolean alive = true

如何告诉编译器列表不相等?抱歉让您的解释混淆了,提前谢谢您!!!:D

共有3个答案

季炯
2023-03-14

您需要重写hashcode和equals方法。这是代码

输出是

真-假

public class test {
    public static void main(String[] args) {
        Human rob = new Human(110, 100, false);
        Human bob = new Human(110, 100, true);
        Human tob = new Human(110, 100, false);
        System.out.println(rob.equals(tob));
        System.out.println(rob.equals(bob));
    }
}

class Human {
    int height;
    int weight;
    boolean alive;

    public Human(int height, int weight, boolean alive) {
        super();
        this.height = height;
        this.weight = weight;
        this.alive = alive;
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + (alive ? 1231 : 1237);
        result = prime * result + height;
        result = prime * result + weight;
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Human other = (Human) obj;
        if (alive != other.alive)
            return false;
        if (height != other.height)
            return false;
        if (weight != other.weight)
            return false;
        return true;
    }
    @Override
    public String toString() {
        return "Human [height=" + height + ", weight=" + weight + "]";
    }
}
阳光辉
2023-03-14

(恕我直言)比较列表最易读的方式:

assertThat(actualitems, is(expectedItems));

使用assertThat()和hamcrest is()匹配器(详见此处)。

为了使其工作:您必须在您的类上实现equals()(因此hashCode()(请参阅此处了解如何执行此操作)。

换句话说:如果你想让这些字段在比较两个对象时参与进来,那么你需要通过将“逐个字段”比较作为@Overrid equals()实现的一部分来表达这一点。任何像样的IDE都可以为你生成这些方法——但是在学习Java时,自己做几次是一个很好的练习。

端木志诚
2023-03-14

您可以使用Assert。班

 assertArrayEquals(Object[] expecteds, Object[] actuals) 

看http://junit.org/junit4/javadoc/4.8/org/junit/Assert.html

对象的equals方法必须比较所有必要的属性。

 类似资料:
  • 问题内容: …换句话说:假设我有2个这样声明的字符串: 这两个字符串是两个不同的对象,但是如果我运行 我得到“ equals()返回true”。这是因为String类重写equals()方法以实现内容级别相等。但是,我需要访问一个引用级别的相等性(如在Object中实现的相等性),以将一个对象与两个对象区分开。我怎样才能做到这一点? 我尝试了这个: 尝试调用String的Object equals

  • 问题内容: 是否有任何的java utils的,允许检查对象平等,不受 平等 覆盖?由于某些原因,我不想为类提供equals方法。我在单元测试中需要类似 SomeUtils.equals(a,b)之 类的东西 , 它比较所有对象字段(我想是通过反射)。 问题答案: 您可以在Apache Commons EqualsBuilder中使用

  • 问题内容: 如何检查两个切片是否相等? 问题答案: 您需要遍历切片中的每个元素并进行测试。未定义切片的相等性。但是,如果要比较type的值,则有一个函数。

  • 如何检查两个切片是否相等?

  • 问题内容: 据我了解(如果我错了,请纠正我),Hibernate使用对象引用来检查对象的相等性。当Hibernate识别同一数据库记录中有多个对象附加时,它将引发以下异常。 我的问题是,Hibernate是否使用方法检查对象是否相等(默认的equal方法使用对象引用)?如果为true,则重写的方法会改变Hibernate的行为吗? 注意:我的问题不是关于Hibernate持久对象中的实现或方法问题

  • 问题内容: 我正在搜索一个给定值的切片: 在普通情况下,类型为。但是,例如,如果类型是一些自定义的,该怎么办? 问题答案: 感谢@CodingPickle评论,我提供了Go编程语言规范中的以下内容 等号运算符==和!=适用于可比较的操作数。 关于s和: 接口值是可比较的。如果两个接口值具有相同的动态类型和相等的动态值,或者两个接口值都为nil,则它们相等。 当类型X的值可比较并且X实现T时,非接口