これらのメソッドに含まれるインスタンス変数を見て、ハッシュコードとequalsメソッドのテストを自動的に生成できるツール/ライブラリはありますか?hashcode、equals、toStringメソッドのユニットテストを生成する
答えて
グアバはを使用していますテストビルダーequals
およびhashCode
。
toString()
は尊重するような「契約」をしてはならないので、単体テストは奇妙で有用ではないでしょう。
このprojectをequals()
に関して見ることができます。
同じトピックに関するEqualsHashCodeTestCase
JUnitのアドオンもあります:
私はそれを自分でテストしたことはありませんが、なぜtoStringが仕様を持つことができないのか分かりません。 –
さて、私はそれができないと言っていませんでしたが、そうすべきではありません。'toString()'はオブジェクトの文字列表現であるため、人が読むことができます(Objectのjavadocを参照)。これは基本的に「極端な」ものではないことを示していますビジネスメソッド)、それは人間が読むことができるStringを返し、解析されないことを示します。そこから 'toString'を単体テストしてはいけないと言うのは簡単です("できない "または"しない ")。 –
はい、すべてのクラスをブランケットテストすると意味がありません。特定のクラスが 'toString'に対してより厳しい要件を課すことは合法であることに注意してください。 JSE自体にはたくさんの例があります( 'StringWriter'、' StringBuilder'、 'URL'、...)。 –
Apache EqualsBuilderとHashCodeBuilderを使用してequalsとhashCodeを実装し、正しく実行できないリスクを最小限に抑えることができます。
等価検定は簡単ですが、インスタンスの値が等しい(等しいと思われる)2つのインスタンスを作成し、もう一方をパラメータとして渡すインスタンスでequalsを呼び出すと、trueを返すと予想されます。 D
質問は、hashCode契約が壊れていないことをどのようにテストできますか? 1つのテストを実装するには、次の2つのことを確認する必要があります。1. equalsがtrueを返す場合、hashCodeは同じ値を返さなければなりません。 2. hashCodeが異なる値を返す場合、equalsはfalseを返す必要があります。 – mentallurg
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");
}
});
}
- 1. インタフェース内のtoString、hashcode、equalsメソッド
- 2. hashcodeとequalsメソッドをオーバーライドして固有の質問を生成する方法
- 3. ハッシュマップオーバーライドequalsとhashcode
- 4. CXF JAXBベーシックEquals/Hashcode
- 5. マッピングの正しいhashCode()メソッドとequals()メソッドをnetbeansが自動的に生成できますか?
- 6. ハイバネーションツールtoStringとメソッド生成
- 7. javaのequalsとhashcodeをオーバーライドするタイミング
- 8. hashCode/equalsコントラクトのJUnit理論
- 9. jaxwsでwsimportを使用してequals()およびhashcode()メソッドを生成する方法
- 10. Java - hashCodeとtoStringのオーバーライド
- 11. hashcode()とequals()について
- 12. hashCodeとequalsメソッドをcompareToメソッドでオーバーライドする必要がありますか?
- 13. いつequalsメソッドとhashcodeメソッドをオーバーライドする必要がありますか?
- 14. すべてのクラスは.equalsメソッドと.hashcodeメソッドを持つべきですか?
- 15. toString()メソッドとequals()メソッドを書き込む方法は?
- 16. いつhashcodeとequalsメソッドが必要ですか?
- 17. equalsメソッドとhashCodeメソッドを使用した汎用インターフェースは可能ですか?
- 18. hashCode()、equals()、toString()のすべてを実装してもデータクラスを使用する必要がありますか?
- 19. equalsおよびhashCodeの汎用リフレクションヘルパーメソッド
- 20. HashSetのは、hashCode()およびequals()
- 21. 異なるEnum HashCode生成?
- 22. Java:自動equals()およびhashCode()
- 23. JCodeModelを使用してtoString()メソッドを生成する
- 24. equals()とhashCode()のIntelliJのコード生成テンプレートを変更することは可能ですか
- 25. 生成のtoString()テキスト
- 26. equalsをオーバーライドする必要がない場合のHashCodeのオーバーライド
- 27. JPAでエンティティマネージャがhashcodeとequalsを使用する方法
- 28. スカラーでequalsとhashCodeを実装する方法
- 29. equals()に依存する抽象クラスのメソッドをMockitoでユニットテストする方法は?
- 30. 不変型のコンストラクタでHashCodeを生成
どのIDEを使用していますか? – buymypies
このようなテストには実質的な意味はありませんが、主にメンテナンスが導入されます。 –
@MPlatvoet私は本当にあなたに同意しません、あなたのコードのいくつかがそれに強く依存している場合、 'equals()'と 'hashcode()'をテストすることが特に重要になるかもしれません。( 'HashMap'、継承を伴う等価性テスト) –