2015-06-24 57 views
5

我試圖獲得Java的竅門。單元測試對我來說非常重要,所以最近我開始使用JUnit。開始很艱難,但我已經掌握了它。除了比較同一類的兩個對象(我還沒有試過測試一個創建不同類的對象的函數)之外,我所有的測試都已經完成了。基本上,當我在創建類的新實例的類中有一個方法時,我嘗試測試該方法時,出現奇怪的錯誤。當比較兩個對象時,JUnit assertEquals()不起作用

「預期:[email protected][email protected]

我試圖研究這個問題,但沒有發現有很大幫助什麼。 Here's我在github上的類的鏈接。我試圖測試的方法是mt()方法,測試類是ILogTest

這不是唯一的情況下,我有這個問題。對於任何具有返回同一類的新對象的方法的類,我都會得到這個完全相同的3f91beef錯誤(即使對象更復雜 - 帶參數)

+4

你沒有'equals'。 – user2357112

+0

你是什麼意思?當涉及到對象時,我需要使用該方法而不是assertEquals嗎? –

+0

可能重複[爲什麼我們必須重寫java中的equals()方法](http://stackoverflow.com/questions/15175109/why-do-we-have-to-override-equals-method-in-java ) –

回答

7

assertEquals將針對每個要比較的對象使用Object#equals 。看起來你的班級ILogTest不會覆蓋equals方法,因此調用Object#equals只會比較自身的引用,並且由於它們是不同的對象引用,所以結果將爲false。

你有兩個選擇:

  1. 覆蓋public boolean equals(Object o)ILogTest
  2. 在實施equals方法的相關領域上使用assertEquals例如String,Integer,Long等等。這個需要更多的代碼,但是當你不能修改被聲明的類時,這個代碼很有用。
+0

謝謝,我不確定爲什麼這個問題會得到負面關注,但你對我說得很清楚 - 歡呼聲 –

+0

不客氣。 –

+0

當equals()超時時,測試代碼如何更改? –

2

如果您使用現代IDE進行開發(如Eclipse,IntelliJ等),則可以使用生成這些方法。檢查出來有兩個原因:1)節省時間2)防止可能的錯誤。在eclipse IDE中,你可以通過選擇source - > generate hashCode()和equals()來完成這項工作。

還有一件事,當你執行這兩個時,你的必須執行另一個。

+0

所以當你生成這些新方法時,他們是否需要額外的注意? –

+0

您不必重寫(不實現)這兩種方法。這是一個建議,但沒有必要。 –

+0

@Luiggi,如果你爲了嬉戲目的而壓倒他們,是的,你不需要重寫他們兩個。但是實際上,你會覆蓋它們,因爲這是有原因的,而且這個原因在默認實現中找不到答案。所以,這兩個都是推薦的,也是一個非常好的主意。不要拿我的話,但[檢查了這一點](http://www.javapractices.com/topic/TopicAction.do?Id=17) – Alp

2

您需要覆蓋equals(超類中的equals方法)如果兩個引用都指向相同的對象,那麼Object會檢查引用equals如果不是false,則返回true,因此您需要寫下一個equals方法來檢查對象的內容並檢查值是否相同,也建議您重寫您的hashCode方法。

一個例子可以是:

Custom a= new Custom(""); 
Custom b= a; 

//b would be equal a. because they reference the same object. 
Custom c= new Custom(""); 
//c would not be equal to a, although the value is the same. 

瞭解更多您可以檢查: Why do I need to override the equals and hashCode methods in Java?