我正在编写很多单元测试,它们使用不同的类做类似的事情。
我想比较同一类的集合。该类指定一个 id 属性。在集合 A 中,此属性全部为空。在 Set B 中设置了此属性。(Set B 已被持久化到数据库并且 uids 已被填充)。
对于我的单元测试,我想确保 Set A 与 Set B 匹配,而且我显然不希望它查看 id 字段。
最有效、最干净、最干燥的方法是什么?
我正在编写很多单元测试,它们使用不同的类做类似的事情。
我想比较同一类的集合。该类指定一个 id 属性。在集合 A 中,此属性全部为空。在 Set B 中设置了此属性。(Set B 已被持久化到数据库并且 uids 已被填充)。
对于我的单元测试,我想确保 Set A 与 Set B 匹配,而且我显然不希望它查看 id 字段。
最有效、最干净、最干燥的方法是什么?
首先,比较两组的大小,如果它们不相等,则测试失败。
对于不平凡的情况,java.util.Comparator
为集合元素定义 a,根据此比较器对两者进行排序(您可以包含/省略您不想比较的属性)。然后遍历这两个集合,根据您的规则比较元素(如果我理解正确的话,与比较器定义的不同)。
我假设您已经正确定义了您的equals
和hashCode
方法,并且不想为了测试而更改它们。
您需要覆盖不应在两个方法中包含 id 字段的类的 hashCode() 和 equals() 方法,然后 equals 方法 Set 将按照您的意愿工作。
例如,
class Test{
int id;
String name;
String other;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((other == null) ? 0 : other.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Test other = (Test) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (this.other == null) {
if (other.other != null)
return false;
} else if (!this.other.equals(other.other))
return false;
return true;
}
}
现在 Test 类对象不依赖于 ID。您可以使用 Eclipse 之类的 IDE 轻松生成 equlas 和 hashCode 方法。
您可以覆盖类中的equals()
&hashCode()
方法,然后使用removeAll()
方法从Set B
. 发布这个,如果集合是空的,那么它们匹配,否则它们不匹配。
请注意,被覆盖的方法应该具有不涉及id
.
重复项逻辑的比较是在 Java 中使用equals()方法实现的。
myString.equals("比较一下");
当您需要比较您的客户类型的对象时,您必须重写 equals 方法。
Student student1=new Student();
Student student2=new Student();
student1.equals(student2);
但是当你重写 equals() 方法时要小心。您需要根据一些唯一的 id 提供一些比较基础。例如,以下实现使用 Roll 编号作为唯一 id 进行比较
public class Student {
private int rollNo;
private String name;
private String address;
// Getters and Setters
@Override
public int hashCode() {
// Overide this only when you use Hashing implementations
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
System.out.println("Not Equal due to NULL");
return false;
}
if (this == obj) {
System.out.println("Equals due to same reference");
return true;
}
if (getClass() != obj.getClass()) {
System.out.println("Different Type");
return false;
}
Student other = (Student) obj;
if (rollNo == other.rollNo) {
System.out.println("RollNo " + rollNo + " EQUALS " + other.rollNo);
return true;
}
if (rollNo != other.rollNo) {
System.out.println("RollNo " + rollNo + " NOT EQUALS " + other.rollNo);
return false;
}
System.out.println("Default is FALSE");
return false;
}
}