2017-05-03 80 views
-1

测试重复的元素如何编写JUnit测试情况下,在用户列表测试重复的值在以下代码如何编写JUnit测试案例在列表

public List<User> getUsersNotInCurrentGroup() 
{ 
List<User> userList = null; 
userList = getEntityManager().createQuery("select * from User") 

return userList; 
} 
+1

欢迎来到Stack Overflow!请参考[游览](http://stackoverflow.com/tour),环顾四周,阅读[帮助中心](http://stackoverflow.com/help),特别是[我该如何问一个好问题?](http://stackoverflow.com/help/how-to-ask)和[我可以问什么问题?](http://stackoverflow.com/help/on-topic)。从第二个环节来看:“提出作业帮助的问题必须包括您迄今为止解决问题所做的工作的总结,并描述您解决问题的难度。”即使它没有作业... –

+0

作为一个方面说明:这不是一个方法,其结果应该被断言。该方法仅仅是'createQuery'的一个简单封装。唯一可以测试的事实是调用'createQuery',被调用一次,并且方法的结果与'createQuery'的结果相同。假设这种方法值得测试。 – Arkadiy

+0

我不是那些数据库框架:是'createQuery()'应该返回一个QUERY,或创建并执行一个查询,并返回数据库中找到的对象? – GhostCat

回答

0

我想在这种特殊情况下提到,你至少应该知道什么使User独一无二。

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

如果比较SQL count(1)为每个查询返回的大小,将会容易得多。

但后来这不是一个Java单元测试了,变成了一种DB单元测试:)的

+4

好主意。我不禁感到,虽然这应该用表上的索引来强制执行,而不是用Java测试的单元。 –

+0

@TimB的权利。真正错误的是这种单元测试会做什么检查。 – freedev

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是另一个的重复,我们检查了两个对象的ID和电子邮件是否是相同的,但我们不”不在乎nickname字段是否不同。这一决定纯粹是基于业务需要。

一旦你有了这个方法,你可以遍历列表来查看给定的对象是否与列表中的其他对象相同,使用equals()方法来比较它们。作为一个便笺,如果你只是关心一个集合没有任何重复,你可以使用一个Set而不是一个List,它将调用equals()方法,你可以通过这个方法来为你比较对象。