2017-05-03 81 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()方法,你可以通過這個方法來爲你比較對象。