20

私は、それhashCodeが と一致しequals、それequalsが と一致していることを確認する契約上の必要性を十分に認識していcompareToます。ただし、これは実際にはしばしば違反されます。この一貫性を自動的にテストできるツール、手法、またはライブラリはありますか?

残念ながら、答えは「いいえ」だと思いますが、手動でカスタムテストを書く必要がなく、ライブラリ呼び出しやフレームワークを利用できるこの種の単体テストを作成できると便利です。それが重要な場合ごとに。

一貫性の意味が明確でない場合は、以下hashCodeequals参照してください。

equals(Object) メソッドに従って 2 つのオブジェクトが等しい場合、2 つのオブジェクトのそれぞれで hashCode メソッドを呼び出すと、同じ整数結果が生成される必要があります。

equalsおよび私は以下compareToを参照します。

クラス C の自然順序付けは、e1.compareTo(e2) == 0 がクラス C のすべての e1 および e2 に対して e1.equals(e2) と同じブール値を持つ場合にのみ、equals と一致すると言われます。

4

5 に答える 5

12

Guavaのテストには、テストとの単体テストEqualsTesterの日常的な部分として使用するというユーティリティがあります。その使用は次のようになりますequalshashCode

new EqualsTester()
  .addEqualityGroup("hello", "h" + "ello")
  .addEqualityGroup("world", "wor" + "ld")
  .addEqualityGroup(2, 1 + 1)
  .testEquals();

これは、同じグループ内のすべての値が等しく、同じハッシュコードを持っていること、異なるグループが等しくないこと、および他のさまざまな不変条件がすべて満たされていることをテストします。自分で使用することも、アイデアを借りることもできます。

テスト値を生成したり明示的に指定したりせずにテストできるとしたら、それは停止性問題と同等である可能性が非常に高いと思われるため、非常に驚​​きます。

于 2012-03-08T20:12:47.407 に答える
5

JUnitを使用している場合、拡張パッケージにはEqualsHashCodeTestCaseが含まれています。これは、Java仕様で概説されているすべて(再帰的、推移的、対称的など)についてequalsとhashCodeの両方を完全にテストします。あなたがしなければならないのは、チェックに使用する親クラスに等しいオブジェクトと等しくないオブジェクトを提供することです。

CompareToメソッドはComparableインターフェースの一部であるため、実際には別のテストケースであるComparabilityTestCaseに分割されます。これには3つのオブジェクトが必要です。1つは小さい値、等しい値、大きい値です。これらをオーバーライドすると、親クラスが残りを処理します。

于 2013-02-12T18:19:44.960 に答える
1

hashCode および equals メソッドの単体テストに役立ついくつかのユーティリティ メソッドを作成しました。

http://softsmithy.sourceforge.net/devlib/docs/api/org/softsmithy/devlib/junit/Tests.html

ライブラリはオープン ソースであり、ここからダウンロードできます: http://sourceforge.net/projects/softsmithy/files/softsmithy-devlib/v0.1/

またはMavenで:

    <dependency>
        <groupId>org.softsmithy.devlib</groupId>
        <artifactId>devlib-core</artifactId>
        <version>0.1</version>
        <scope>test</scope>
    </dependency>
于 2012-03-08T20:15:23.240 に答える
1

Koratと呼ばれる非常に優れたツールがあり、徹底的な検索を実行して Java クラスの正確性を小さなケースでチェックできます。プログラムが実際に区別できる特定のサイズのさまざまなテストケースをすべて構築するために、実行されるコードを実際に調べます。大規模なケースでどれほど役立つかはわかりませんが、多くのプログラムでは、このようなケースが正しく機能するかどうかを自動的にチェックするために使用できます。

お役に立てれば!

于 2012-03-08T20:35:25.760 に答える
1

最近、meanbean (http://meanbean.sourceforge.net/) を使用して、equals() および hashCode() コントラクト (および setter/getter ペア) のクラスを自動的にテストしました。

「ミーン・ビーン:

1. JavaBean/POJO の getter メソッドと setter メソッドのペアが正しく機能することをテストします。

2. クラスの equals メソッドと hashCode メソッドがそれぞれ Equals コントラクトと HashCode コントラクトに準拠していることを確認します。

3. オブジェクトの等価性におけるプロパティの重要性を検証します。"

meanbean に固有の質問がまだたくさんあります: equals() と hashCode() の一貫性を検証するかどうか。さらに、私はそれを倒すために一生懸命努力していません。私はそれがcompareTo()をサポートしていないと信じています。そして、私は代替案を試していません。他人の経験に興味を持つ。

于 2012-11-09T16:23:34.943 に答える