2016-10-14 32 views
0

我:JUnit的比較實體的兩個列表

List<SlaveEntityDTO> result = Jsoner.JsonToSlaveEntityDTO(json); 
List<SlaveEntityDTO> result1 = entitiesDTOList; 

結果和RESULT1擁有各自領域的價值觀:

enter image description here

當我運行Assert.assertEquals(result, result1);我收到以下消息:

java.lang.AssertionError: 
Expected :[[email protected], [email protected]] 
Actual :[[email protected], [email protected]] 

那麼我怎樣才能比較重新結果和result1中的字段的值,而不是比較對象是否是該對象?

的SlaveEntityDTO是這樣的:

public class SlaveEntityDTO extends BaseEntityDTO<SlaveEntity> { 

    private String ip; 
    private String macAddress; 
    private String status; 

    private List<PositionEntity> positions; 

    @Override 
    public SlaveEntity convertToEntity() { 
     return new ModelMapper().map(this, SlaveEntity.class); 
    } 
} 

而且BaseEntityDTO是這樣的:

public abstract class BaseEntityDTO<T> implements Serializable{ 

    private long id; 

    public abstract T convertToEntity(); 
} 
+3

已覆蓋了SlaveEntityDTO equals方法? – Compass

+0

看到我的回答:看起來你要麼沒有爲SlaveEntityDTO實現equals,要麼你的實現不正確。如果您可以向我們展示您的課程的源代碼,我將編輯我的答案,以提出如何解決該問題。 – nasukkin

回答

3

您的測試看起來不錯。 List接口定義了其equals的行爲,而您的調試器顯示正在使用ArrayListArrayList是一個好人,所以我們可以假定它的等式的實現是合法的。

因此,我們可以得出結論,您的SlaveEntityDTO類要麼不覆蓋Object#equals(Object),要麼這樣做是因爲您沒有考慮到(這可能意味着它不正確地實現)。

您可以通過在BaseEntityDTO重寫equals解決這個問題。這將給每個子類別提供equals的基本行爲。

@Override 
public boolean equals(Object o) { 
    if (this == o) return true; // literally the same object. 

    if (o == null || getClass() != o.getClass()) return false; // Not correct type. 

    BaseEntityDTO that = (BaseEntityDTO) o; 
    return this.id == null ? that.id == null : this.id.equals(that.id); 
} 

而且不要忘記:hashCode()必須匹配equals執行!

@Override 
public int hashCode() { 
    return id == null ? 0 : id.hashCode(); 
} 
+0

請注意,有[不同的流派](http:// stackoverflow。com/questions/596462/any-reason-to-prefer-getclass-over-instanceof-when-generating-equals)關於是否使用'getClass()'或'instanceof'進行類型比較。 – shmosel

+0

@shmosel瞭解。但是,我發佈的方式與IntelliJ如何自動實現迄今爲止的equals方法一致。我遵循他們(IntelliJ的開發者)的智慧/偏好來達到這篇文章的目的:) – nasukkin

+0

@Cristian你的班級定義證實了我的懷疑。你需要在'SlaveEntityDTO'類中重寫'equals'和'hashCode'。否則,你會得到默認的平等行爲,這就是身份平等,這是幾乎從不*你想要的。 – nasukkin

0

When I run Assert.assertEquals(result, result1); I am getting the following message:

java.lang.AssertionError: Expected :[[email protected], [email protected]] Actual :[[email protected], [email protected]]

就像你說的,因爲你是比較的對象,而不是兩個對象的內容,你所得到的錯誤。

這樣做的一種方法是將兩個JSON對象轉換爲字符串,然後比較兩個字符串,但請記住,JSON中的順序不固定,並且可能發生結果對象的元素按順序{2, 1, 3},但源對象的順序是{1, 2, 3}

我想你應該嘗試建立規定了你的源元素和結果元素,然後在它比較都基於它們的大小集以及還元素斷言兩個對象是否相等。

你可以看到這篇文章here更多地瞭解JSON的比較:

+0

將對象轉換爲字符串並將其與另一個字符串進行比較是執行對象平等的可怕方法。另外,java.util.List對於如何支持它的equals方法有一個完整的定義和規範,所以它應該被認爲是一種很好的依賴它的形式。 – nasukkin

+0

@nasukkin我想你誤解了我。我不是建議將對象本身轉換爲String,而是將JSON字符串化並進行比較。但正如我所說的那樣,它可以用於單個元素,但如果有更多的元素,那麼它可能會導致問題,因爲響應的接收順序不固定。 – user2004685