2012-06-14 245 views
1

我在學習JUnit,我知道assertEquals()調用equals()方法來比較對象...那麼爲什麼下面的測試比較兩個正則表達式模式對象沒有通過?JUnit,比較對象

@Test 
public void testTwoCompiledPattern() 
{ 
    assertEquals(Pattern.compile("test"), Pattern.compile("test")); 
} 

這一個通行證,而不是:

@Test 
public void testTwoCompiledPattern() 
{ 
    assertEquals(Pattern.compile("test").toString(), Pattern.compile("test").toString()); 
} 
+1

我覺得有什麼問題。我首先認爲我們不應該檢查是否創建了正確的模式。我寧願檢查傳遞給模式的字符串(如果你的代碼生成它們)。你能分享一下你在這個特殊測試中檢查什麼? –

+0

+1。這只是一個學習JUnit的測試,在實際情況下,我會按照您的建議檢查字符串。 – mt22

回答

7

它,因爲當你調用toString()方法,一方面是因爲該模式類重寫它返回的「測試」字符串。但是,如果僅比較Pattern對象,則它們是2個不同的對象,因此即使它們具有相同的狀態,也不等於另一個對象。

equals方法檢查引用是否相等。

+0

謝謝。在這些情況下比較對象的最佳做法是哪些?的toString()? – mt22

+1

好吧,你可能討厭有人說這個,但「這取決於」。你將不得不檢查Java API來查看哪些方法可以幫助你實現你想要的。在Pattern類的情況下,有一個名爲pattern()的方法,返回編譯了Pattern對象的String正則表達式,在這種情況下爲「test」,然後可以比較它們。 (在這種情況下,pattern()和toString()一樣)。但是當你擁有你自己的類時,你可以重寫equals方法來實現你自己的對象相等,但是你必須遵守某些規則。 –

1

。Pattern對象的等式檢查是否兩個引用同一個對象。

然而String.equals方法檢查兩個串是相同的(不是對象參考比較)

即爲什麼第二一個通過。

+0

謝謝。簡單的Java問題:一般來說,我怎麼知道equals()方法檢查對象引用或內容的時間? – mt22

+1

一般你不知道。唯一的方法是讀取方法/類的JavaDoc,它應該描述內部行爲。 – Yura

+0

+1。謝謝你也好。 – mt22

0

equals()方法比較兩個對象的哈希碼。在最後一種情況下,有兩個不同的對象具有不同的哈希碼,因此測試失敗。在後一種情況下,有兩個字符串「test」,它們將具有相同的哈希碼,以便測試通過。

+0

不是真的,2個相同的對象必須給出相同的散列碼,但如果它們具有相同的散列碼,則它們不需要相等。所以equals方法比較參考值相等,而不是哈希碼相等。在字符串的情況下,如果您有兩個具有相同值的字符串引用,它們隱式指向相同的字符串對象,這就是爲什麼它們是相等的。 –