0

我正在编写很多单元测试,它们使用不同的类做类似的事情。

我想比较同一类的集合。该类指定一个 id 属性。在集合 A 中,此属性全部为空。在 Set B 中设置了此属性。(Set B 已被持久化到数据库并且 uids 已被填充)。

对于我的单元测试,我想确保 Set A 与 Set B 匹配,而且我显然不希望它查看 id 字段。

最有效、最干净、最干燥的方法是什么?

4

4 回答 4

1

首先,比较两组的大小,如果它们不相等,则测试失败。

对于不平凡的情况,java.util.Comparator为集合元素定义 a,根据此比较器对两者进行排序(您可以包含/省略您不想比较的属性)。然后遍历这两个集合,根据您的规则比较元素(如果我理解正确的话,与比较器定义的不同)。

我假设您已经正确定义了您的equalshashCode方法,并且不想为了测试而更改它们。

于 2013-04-10T10:50:42.837 回答
0

您需要覆盖不应在两个方法中包含 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 方法。

于 2013-04-10T10:45:32.123 回答
0

您可以覆盖类中的equals()&hashCode()方法,然后使用removeAll()方法从Set B. 发布这个,如果集合是空的,那么它们匹配,否则它们不匹配。

请注意,被覆盖的方法应该具有不涉及id.

于 2013-04-10T10:46:05.320 回答
0

重复项逻辑的比较是在 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;
  }

}
于 2013-04-10T11:01:23.940 回答