如何编写Junit测试用例来测试List中的重复元素

时间:2017-05-03 13:06:30

标签: java arraylist junit

如何编写junit测试用例来测试代码

中提到的userList中的重复值
public List<User> getUsersNotInCurrentGroup()
{
List<User> userList = null;
userList = getEntityManager().createQuery("select * from User")

return userList;
}

2 个答案:

答案 0 :(得分:0)

我想,在这种特殊情况下,你至少应该知道User的唯一性。

然后使用distinct子句添加第二个SQL查询,并比较两个返回集合的大小。它的集合大小相同,没有重复。

如果比较每个查询的SQL count(1)返回的大小,那么会更容易。

但是这不再是Java Unit测试了,变成了一种DB单元测试:)

答案 1 :(得分:0)

为重复项编写测试的正确方法取决于您的应用程序定义为重复项。

在Java中,每个对象都从Object class继承方法equals(Object obj)。除非您的User对象覆盖该方法,否则列表中保存的两个User对象将被视为相等,因为equals()方法比较表示对象的哈希码而不是数据值存储在该对象中。

如果您可以设想需要检查两个User对象在应用程序中的其他任何位置是否相同,那么最好的选择是覆盖equals(Object obj),以便它比较应用程序认为的值与确定两个User对象是否相同有关。

例如:

public class User {
  private int ID;
  private String nickname;
  private String email;

  ...

  @Overrides
  public boolean equals(Object obj) {
    if (obj.getClass() != User.getClass()) {
      return false;
    } else {
      if (obj.getId() == this.getId() && 
          obj.getEmail().equals(this.getEmail()
         ) {

        return true;
      } else {
        return false;
      }
    }
  }

}

在此示例中,确定一个User是否与另一个nickname重复的方式,我们检查这两个对象的ID和电子邮件是否相同,但我们并不关心{ {1}}字段不同。这种决心完全基于业务需求。

一旦你有这个方法,你可以遍历列表,看看给定的对象是否与列表中的任何其他对象相同,使用equals()方法来比较它们。

作为旁注,如果您只是普遍关注的是没有任何重复项的集合,则可以使用Set而不是List,这将调用您覆盖的equals()方法为你比较对象。