我有:
List<SlaveEntityDTO> result = Jsoner.JsonToSlaveEntityDTO(json);
List<SlaveEntityDTO> result1 = entitiesDTOList;
结果和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();
}
答案 0 :(得分:3)
你的测试看起来很好。 List
接口定义了equals
的行为,调试器显示正在使用ArrayList
。 ArrayList
是一个好人,所以我们可以假设它的equals实现是合法的。
因此,我们可以得出结论,您的SlaveEntityDTO
类要么不覆盖Object#equals(Object)
,要么以您未考虑的方式这样做(这可能意味着它正在实施)它不正确)。
您可以通过覆盖equals
中的BaseEntityDTO
来解决此问题。这将为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();
}
答案 1 :(得分:0)
当我运行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中的顺序不是固定的,可能会发生结果对象按顺序排列{{1}的元素但是源对象的顺序为{2, 1, 3}
。
我认为您应该尝试从源元素和结果元素中创建集合,然后根据它们的大小和它们中的元素比较两个集合来断言这两个对象是否相等。
您可以阅读此帖here以了解有关JSON比较的更多信息: