[英]JUnit comparing two Lists of entities
我有:
List<SlaveEntityDTO> result = Jsoner.JsonToSlaveEntityDTO(json);
List<SlaveEntityDTO> result1 = entitiesDTOList;
result和result1的字段具有相同的值:
當我運行Assert.assertEquals(result, result1);
我收到以下消息:
java.lang.AssertionError:
Expected :[core.dto.SlaveEntityDTO@6be46e8f, core.dto.SlaveEntityDTO@3567135c]
Actual :[core.dto.SlaveEntityDTO@327471b5, core.dto.SlaveEntityDTO@4157f54e]
那么,如何比較result和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();
}
您的測試看起來不錯。 List
接口定義其equals
的行為,調試器顯示正在使用ArrayList
。 ArrayList
是個好人,因此我們可以假定equals的實現是合法的。
因此,我們可以得出結論,您的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();
}
當我運行Assert.assertEquals(result,result1); 我收到以下消息:
java.lang.AssertionError:預期的:[core.dto.SlaveEntityDTO @ 6be46e8f,core.dto.SlaveEntityDTO @ 3567135c]實際的:[core.dto.SlaveEntityDTO @ 327471b5,core.dto.SlaveEntityDTO @ 4157f54e]
如您所說,由於比較對象而不是兩個對象的內容,因此出現錯誤。
一種方法是將兩個JSON對象都轉換為字符串,然后比較兩個字符串,但請記住,JSON中的順序不固定,並且可能會導致結果對象的元素順序為{2, 1, 3}
但是源對象按{1, 2, 3}
的順序排列。
我認為您應該嘗試從源元素和結果元素中創建Set,然后根據它們的大小以及其中的元素比較Set,以斷言兩個對象是否相等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.