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

时间:2017-08-31 11:04:36

标签: java arraylist junit equality

我在JUnit测试中检查两个arraylists的相等性时遇到问题。当我测试两个列表的相等性时,它只检查它们的字符串表示是否相同。它适用于简单的示例,如[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

4 个答案:

答案 0 :(得分:2)

您可以使用Assert.class

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

请参阅http://junit.org/junit4/javadoc/4.8/org/junit/Assert.html

对象的equals-Methode必须比较所有必要的属性。

答案 1 :(得分:2)

(imho)最易读的比较列表方式:

assertThat(actualitems, is(expectedItems));

使用assertThat()和hamcrest is()匹配器(请参阅here进一步阅读)。

为了实现这一目标:您必须在课堂上实施equals()(以及hashCode() {(here如何执行此操作)。

换句话说:如果你想比较两个对象时这些字段采用部分,那么需要通过字段"字段来表示#34; @Override equals()实现的比较部分。任何体面的IDE都可以为你生成这些方法 - 但是在学习Java时,自己做几次这是一个很好的练习。

答案 2 :(得分:1)

您需要覆盖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 + "]";
    }
}

答案 3 :(得分:0)

一种简单的方法是

assertTrue("check equality", Arrays.equals(list1.toArray(), list2.toArray());

唯一的缺点是你只得到它们不相等的信息,而不是数组中不平等发生的地方。