2016-11-05 10 views
0

Javaでequalsメソッドをどのように使用しますか? JUnitでは、2つの値が等しいと初期化されているかどうかを確認するためにテストしていますが、テストは失敗しています。渡されているオブジェクトが他のオブジェクトのinstanceofであることを確認しましたが、なぜ私のテストが失敗しているのか分かりません。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

申し訳ありませんが、私はまだハッシュコードに精通していません –

答えて

3

どのようにJavaでequalsメソッドを使用していますか?

あなたはそれを呼び出します。


あなたが本当に知りたいのは、あなたのテストが失敗した理由です。そして、あなたはどうすればいいのですか?equals(Object)を実装してください。一般的に、答えは、それがあなたの(全体)オブジェクトの意図されたセマンティクスに依存するということです。

面白いことに、あなたが書いたコードは大抵正しいです。あなたがしたように、キャッチして潰すことExceptionは悪い習慣であり、おそらく意味的に間違っています。それはあなたの問題の本当の原因を隠すことができます。例えばフィールド比較の1つで、予期しないNPE。

あなたのコメント:

を私は問題があるが、それは今私のコードに影響を与えず実現?

潜在的に、はい!

equalsの場合、予期しない未チェックの例外が伝播する可能性があります。不完全なフィールドを持っている不完全なBillオブジェクトを比較することは間違いです。コードがそれに対処することを意図している場合(すなわち、nullフィールド)、nullのテストを使用してNPEを回避する必要があります。

(私はそれがequalsfalseを返すために、原因としてnullフィールドを処理するために理にかなっているとは思わない。あなたはそれ自体に対してnullフィールドでBillを比較した場合にどのような、例えば。)

完全に確認するために、他に問題がないことを確認するには、Billクラスの実装の残りの部分を参照する必要があります。 - 先生が指摘@として


最後に、あなたはequalsを上書きした場合、あなたは(技術的に)だけでなくhashCodeをオーバーライドする必要があります。 またはHashSetの要素のキーとしてBillを使用し、そのクラスが互換性のないequalsおよびhashCodeのメソッドを使用すると、悪いことが起こります。

関連する問題