その質問についての最初の考えです(これは、1時間経ってもまだ答えがない理由を説明するかもしれません!?;)
質問に対する解決策を実装することになると、2 つの部分があるようです。
1/ 自分のすべてのクラスを取得します。簡単です。jar 名を指定すると、Junit テストの初期化メソッドは次のようになります。
- そのjarがJUnit実行クラスパスにあるかどうかを確認します
- その中のすべてのクラスを読み込んでロードする
- equals() および hash() が宣言され、(リフレクションによって) 再定義されたもののみを記憶します。
2/ すべてのオブジェクトをテストする
...そしてそこに問題があります。これらのオブジェクトをインスタンス化する必要があります。つまり、2 つのインスタンスを作成し、それらを equals() テストに使用します。
つまり、コンストラクターが引数を取る場合は、次のことを考慮する必要があります。
- プリミティブ型の引数 (int、boolean、float、...) または String の場合、制限値のすべての組み合わせ (String の場合、"xxx"、""、null の場合。int、0、-x、+x、-Integer の場合) .MIN、+Integer.MAX、...など)
- 非プリミティブ型の場合、テストするオブジェクトのコンストラクターに渡されるインスタンスを構築します (つまり、そのパラメーターのコンストラクター パラメーターを再帰的に考慮する必要があります: プリミティブ型かどうか)。
最後に、これらのコンストラクター用に自動的に作成されたすべてのパラメーターが機能的に意味をなすわけではありません。つまり、これらの値の一部は、Assert が原因でインスタンスの構築に失敗します。これは検出する必要があります。
それでも可能だと思われます (必要に応じてコード チャレンジにすることもできます) が、最初に他の StackOverflow 読者がこの問題に対応できるようにしたいと思います。
組み合わせの問題を回避し、テスト関連のテスト値を実際のコード自体に近づけるために、コンストラクターの有効な値を表す文字列を使用して、専用の注釈を定義することをお勧めします。オブジェクトの 1 つの equals() オーバーライドされたメソッドのすぐ上に配置されます。
次に、これらの注釈値が読み取られ、それらから作成されたインスタンスが結合されて、equals() のテストが行われます。それは組み合わせの数を十分に抑えるでしょう
サイドノード: 一般的な JUnit テスト ケースでは、もちろん、テストに対する equals() ごとに、以下があることを確認します。
- 上記のいくつかの注釈 (デフォルトのコンストラクターしか利用できない場合を除く)
- 対応する hash() メソッドもオーバーライドされます (そうでない場合は、アサート例外がスローされ、そのクラスで失敗します)