2016-11-05 87 views
0

如何在Java中使用equals方法?在JUnit中,我正在測試以確定兩個初始化爲相等的值是否相同,並聲明它們是相同的,但我的測試失敗。我確保檢查傳入的對象是另一個對象的一個​​實例,但我不確定爲什麼我的測試失敗。在Java中測試相等性

@Test 
public void testEqualityOnBillSimple() 
{ 
    Date d1 = new Date(3,4,2020); 
    Money m1 = new Money(10); 
    Bill b1 = new Bill(m1, d1, "fred"); 
    Bill b2 = new Bill(m1, d1, "fred"); 

    assertTrue(b1.equals(b2)); 
} 

public boolean equals (Object toCompare) { 
    try { 
     if (toCompare instanceof Bill) { 
      Bill that = (Bill) toCompare; 
      return this.amount.equals(that.amount) && 
      this.dueDate.equals(that.dueDate) && 
      this.paidDate.equals(that.paidDate) && 
      this.originator.equals(that.originator); 
     } 
    } catch (Exception e) { 
    } 
    return false; 
} 
+0

創建者是表示帳單正在付款的字符串。在這種情況下,它是Fred –

+0

你重寫了'equals()'方法和'hashcode()'嗎? –

+0

對不起,我還不熟悉hashcore –

回答

3

如何在Java中使用equals方法?

你叫吧!


你真正想知道的是爲什麼你的測試如果失敗。並且這沸騰,你應該如何正確實施equals(Object)。一般來說,答案是它取決於(整個)對象的預期語義。

從表面上看,你寫的代碼大部分都是正確的。正如你所做的那樣,抓住並壓扁Exception是不好的做法,並且可能在語義上不正確。它可能是隱藏你的問題的真正原因;例如在一場比較中出乎意料的NPE。

你的評論:

我意識到是有問題的,但它現在對我的代碼的效果?

潛在的,是的!

正確的行爲將是equals可能會允許任何意料之外的unchecked異常傳播。比較不完整的Bill缺少字段的對象可能是不正確的。如果代碼旨在應對(即null字段),那麼您應該使用null測試來避免NPE。

(如果比較Bill與對本身null領域,例如我不認爲這是有道理治療null場爲造成equals返回false什麼。)

完全確信沒有其他問題,我們需要看看Bill類的其他實現。


最後,作爲一個@ - 先生指出,如果重寫equals,你應該(在技術上)覆蓋hashCode爲好。不好的事情會發生,如果你曾經使用Bill如在HashMap鍵或HashSet的元素......和類有不兼容的equalshashCode方法。