2017-08-31 98 views
1

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

这是例如:

如果我有类人(INT高度,INT重量,布尔活着),和toString()方法是对象:

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

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

boolean alive = false 

和在第二

boolean alive = true 

如何告诉编译器列表不相等?对不起,混淆解释,并提前感谢你! :d

+0

1.检查列表中的每个项目,2.在人类中重写equals方法 – SMA

+1

好的新手问题...很高兴看到你很快接受了答案。你还应该在哪里研究这个主题,而不是盲目地复制某人为你写的代码。 – GhostCat

回答

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 + "]"; 
    } 
} 
2

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

assertThat(actualitems, is(expectedItems)); 

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

而为了使这项工作:你必须实现equals()(和你的类后果hashCode()(见here对于如何做到这一点)

换句话说:如果你想这样的领域采取部分比较,当两个物体,比需要通过使该“逐个字段”的@Override equals()实施的比较部位表达什么像样的IDE可以产生你这些方法 - 但学习Java的时候,它是一个很好的运动,可以自己做几次。

0

一个简单的办法是

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

唯一的缺点是,你只能得到的信息,他们是不相等的,但不要在那里不平等发生在数组中。