JUnit 比较两个实体列表
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
class 要么没有覆盖 Object#equals(Object)
,要么以您没有考虑的方式覆盖(这可能意味着它实施不正确)。
您可以通过覆盖 BaseEntityDTO
中的 equals
来解决这个问题。这将为每个子 class.
提供 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();
}
When I run Assert.assertEquals(result, result1); I am getting the
following message:
java.lang.AssertionError: Expected
:[core.dto.SlaveEntityDTO@6be46e8f, core.dto.SlaveEntityDTO@3567135c]
Actual :[core.dto.SlaveEntityDTO@327471b5,
core.dto.SlaveEntityDTO@4157f54e]
如您所说,您收到错误是因为您比较的是对象而不是两个对象的内容。
一种方法是将 JSON 对象都转换为字符串,然后比较这两个字符串,但请记住 JSON 中的顺序不固定,您的结果可能会发生对象的元素顺序为 {2, 1, 3}
但源对象的元素顺序为 {1, 2, 3}
.
我认为您应该尝试从源元素和结果元素中创建集合,然后根据集合的大小和其中的元素比较这两个集合,以确定这两个对象是否相等。
您可以阅读此 post here 以了解有关 JSON 比较的更多信息:
我有:
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
class 要么没有覆盖 Object#equals(Object)
,要么以您没有考虑的方式覆盖(这可能意味着它实施不正确)。
您可以通过覆盖 BaseEntityDTO
中的 equals
来解决这个问题。这将为每个子 class.
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();
}
When I run Assert.assertEquals(result, result1); I am getting the following message:
java.lang.AssertionError: Expected :[core.dto.SlaveEntityDTO@6be46e8f, core.dto.SlaveEntityDTO@3567135c] Actual :[core.dto.SlaveEntityDTO@327471b5, core.dto.SlaveEntityDTO@4157f54e]
如您所说,您收到错误是因为您比较的是对象而不是两个对象的内容。
一种方法是将 JSON 对象都转换为字符串,然后比较这两个字符串,但请记住 JSON 中的顺序不固定,您的结果可能会发生对象的元素顺序为 {2, 1, 3}
但源对象的元素顺序为 {1, 2, 3}
.
我认为您应该尝试从源元素和结果元素中创建集合,然后根据集合的大小和其中的元素比较这两个集合,以确定这两个对象是否相等。
您可以阅读此 post here 以了解有关 JSON 比较的更多信息: