2017-08-31 59 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()); 

唯一的缺點是,你只能得到的信息,他們是不相等的,但不要在那裏不平等發生在數組中。