2012-05-17 11 views
8

これらのメソッドに含まれるインスタンス変数を見て、ハッシュコードとequalsメソッドのテストを自動的に生成できるツール/ライブラリはありますか?hashcode、equals、toStringメソッドのユニットテストを生成する

+0

どのIDEを使用していますか? – buymypies

+0

このようなテストには実質的な意味はありませんが、主にメンテナンスが導入されます。 –

+3

@MPlatvoet私は本当にあなたに同意しません、あなたのコードのいくつかがそれに強く依存している場合、 'equals()'と 'hashcode()'をテストすることが特に重要になるかもしれません。( 'HashMap'、継承を伴う等価性テスト) –

答えて

6

グアバはを使用していますテストビルダーequalsおよびhashCode

3

toString()は尊重するような「契約」をしてはならないので、単体テストは奇妙で有用ではないでしょう。

このprojectequals()に関して見ることができます。

同じトピックに関するEqualsHashCodeTestCase


JUnitのアドオンもあります:

+1

私はそれを自分でテストしたことはありませんが、なぜtoStringが仕様を持つことができないのか分かりません。 –

+0

さて、私はそれができないと言っていませんでしたが、そうすべきではありません。'toString()'はオブジェクトの文字列表現であるため、人が読むことができます(Objectのjavadocを参照)。これは基本的に「極端な」ものではないことを示していますビジネスメソッド)、それは人間が読むことができるStringを返し、解析されないことを示します。そこから 'toString'を単体テストしてはいけないと言うのは簡単です("できない "または"しない ")。 –

+0

はい、すべてのクラスをブランケットテストすると意味がありません。特定のクラスが 'toString'に対してより厳しい要件を課すことは合法であることに注意してください。 JSE自体にはたくさんの例があります( 'StringWriter'、' StringBuilder'、 'URL'、...)。 –

-1

Apache EqualsBuilderとHashCodeBuilderを使用してequalsとhashCodeを実装し、正しく実行できないリスクを最小限に抑えることができます。

等価検定は簡単ですが、インスタンスの値が等しい(等しいと思われる)2つのインスタンスを作成し、もう一方をパラメータとして渡すインスタンスでequalsを呼び出すと、trueを返すと予想されます。 D

+1

質問は、hashCode契約が壊れていないことをどのようにテストできますか? 1つのテストを実装するには、次の2つのことを確認する必要があります。1. equalsがtrueを返す場合、hashCodeは同じ値を返さなければなりません。 2. hashCodeが異なる値を返す場合、equalsはfalseを返す必要があります。 – mentallurg

1

EqualsVerifierは素晴らしいライブラリです。私はしばしばそれをReflectionsライブラリと組み合わせて、特定のクラスを自動的にスキャンし、それらのすべてのための契約を一度にテストします:

@Test 
    public void validateEqualsHashCodeToString() { 
    final Reflections dtoClassesReflections = new Reflections(new ConfigurationBuilder() 
     .setUrls(ClasspathHelper.forPackage("my.base.package")) 
     .filterInputsBy(new FilterBuilder() 
     .include(".*Dto.*") // include all Dto classes 
     .exclude(".*Test.*")) // exclude classes from tests which will be scanned as well 
     .setScanners(new SubTypesScanner(false))); 

    final Set<Class<?>> allDtoClasses = dtoClassesReflections.getSubTypesOf(Object.class); 

    allDtoClasses.forEach(dtoClass -> { 
     logger.info("equals/hashCode tester testing: " + dtoClass); 
     EqualsVerifier.forClass(dtoClass).verify(); 

     try { 
     dtoClass.getDeclaredMethod("toString"); 
     } catch (NoSuchMethodException e) { 
     fail(dtoClass + " does not override toString() method"); 
     } 
    }); 
    } 
関連する問題