Java / Scalaで特定のクラスのランダムオブジェクトを深く生成するために使用できるライブラリ/メソッドは何ですか?深い生成とは、プリミティブ型と複合型の両方について、オブジェクトグラフ全体をランダムな値で再帰的に埋めることを意味します。
目標は、ランダムに生成されたモックオブジェクトをテストに使用することです。
テストの一貫性と再現性を高めるには、生成されたオブジェクトのセットがすべての実行で同一である必要があります。
Java / Scalaで特定のクラスのランダムオブジェクトを深く生成するために使用できるライブラリ/メソッドは何ですか?深い生成とは、プリミティブ型と複合型の両方について、オブジェクトグラフ全体をランダムな値で再帰的に埋めることを意味します。
目標は、ランダムに生成されたモックオブジェクトをテストに使用することです。
テストの一貫性と再現性を高めるには、生成されたオブジェクトのセットがすべての実行で同一である必要があります。
私の知る限り、非常に大きな任意のタイプのオブジェクトをランダムに生成するための2つの強力な方法があります。1つは再帰的方法(WilfとNijenhuisによって導入され、Flajolet、van Cutsem、Zimmermanによって形式化された)と呼ばれ、2つ目はDuchon、Flajolet、Louchard、Schaefferによるボルツマンサンプリングと呼ばれます。
どちらの方法でも、構造定義(「文法」)を指定すると、文法に従った大きなランダムオブジェクトが返されます。
どちらも、プログラムの大規模なテストで非常にうまく使用されています(HaskellのQuickCheckと同様)。残念ながら、メソッドにはさまざまな実装がありますが、Java用のすぐに使用できるライブラリはないと思います。たとえば、何ができるかについては、バイオインフォマティクス用のこれらのメソッドのJava実装を使用してYannPontyのページを確認することをお勧めします。OCamlを使用している場合、AlexisDarrasseとBenjaminCanouは、代数的タイプ(sumtypes)の完全に自律的なライブラリとしてボルツマンサンプリングの有用なサブセットを実装しています。
いくつかの調査によると、 ScalaCheckと呼ばれるScalaの優れたフレームワークがあります。これは、 Jérémieが前述したQuickCheckに触発されたものです。Scala用にビルドされていますが、Javaでも使用できます(ただし、構文糖衣はありません)