2017-02-08 16 views
1

このオブジェクトグラフを再作成するステートメントのセットにラージオブジェクトグラフ(実行時またはデバッグ中)の内容を保存したいという状況がよくあります。これはユニットテストケースのテストデータとして使用できます。オブジェクトグラフのリーフは、標準タイプ(StringBigDecimalDate、等)であり、分岐がBean規則(ゲッター、セッター、空のコンストラクタ)に従う、生成することが可能でなければならないことに注意テストデータを生成するためにコード生成を使用する

screenshot of debugger

この種類のファイル(例えばTestData.java):

public static Car createCar() { 

    Wheel wheel1 = new Wheel(); 
    wheel1.setTypePressure(2.1f); 
    Wheel wheel2 = new Wheel(); 
    wheel2.setTypePressure(2.3f); 
    Wheel wheel3 = new Wheel(); 
    wheel3.setTypePressure(2.0f); 
    Wheel wheel4 = new Wheel(); 
    wheel4.setTypePressure(2.8f); 
    List<Wheel> wheels = new ArrayList<>(Arrays.asList(wheel1, wheel2, wheel3, wheel4)); 

    Brake brake = new Brake(); 
    brake.setBrakeType(BrakeType.PLAIN); 

    Car car = new Car(); 
    car.setBrake(brake); 
    car.setWheels(wheels); 
    car.setColor("blue"); 

    return car; 
} 

は、何らかの形で直接デバッグセッションにこれをプラグインすることは本当に素晴らしいことだが、いくつかのドロップインの文は、「Javaのオブジェクトグラフの作成コードを結果として書き込みコンテンツ付き "出力System.outも機能します。

これはどうすれば最も効率的な方法で実現できますか?

答えて

2

いいアイデアですが、(おそらくは意見が分かれている)ベストソリューションではありません。

はい、そのデータになります。Javaプログラムに変換してください。コンパイルして保存する必要があります。

次に、ソースコードを保存するか、コンパイルしたコードを保存しますか?バージョン管理(データ、または基礎となるJRE)はどうでしょうか?

短い説明:Javaコードは、データを表すのに非常に便利な形式ではありません。したがって、データをJavaコードに変換するのではなく、たとえばJSON表現に変換します。

ポイントは次のとおりです。クラスが実際に「ビーンスタイル」に従っているとき。ゲッター/セッター/デフォルトのコンストラクターを既に持っています - まともなJSONパーサー・ライブラリーは「そのまま」動作するはずです。あなたはそれにあなたの車オブジェクトを投げる。優れた標準JSONが出てきます。次に、そのようなファイルを読み込んでCarオブジェクトに戻す小さなヘルパーツールを作成します。完了しました。

これは道のりです(そして、このアドバイスは、建築家があなたが求めているものを正確に望んでいたシステムに取り組んでいる人から来ています;そして、私たちはそこに到達するために多くの時間と苦労をしました...それは10年以上前のことでしたが、2017年にはそれ以上はやっていません)。

最新のコメントがあります(主にユニットテストコードに興味があります)。私はビルダーのパターンを使用して調べることをお勧めします。

あなたのコードが

new CarBuilder().wheel(new WheelBuilder(). ... 

ことのいいところまで煮詰めるなるように:に様々な方法がありますあなたのためなビルダーを生成します。たとえば、プロジェクトLombokには@Builderアノテーションがあります。

いずれにしても、ビルダーを自動的に生成する市場はかなりですrich

+0

私は同意します。私はまた、仕事でGSONの簡単な例を削除することを提案します。 1ライナーでできることは信じられないほどで、OPが簡単だというだけではないでしょう。 – tucuxi

+0

すぐに使用できるソリューションがない場合は、JSONを試してみます。私の唯一の懸案事項は、(Junit)テストコードから分離したJSONファイルに保存されたデータはリファクタリングを受けないということです。 Ergo:モデルが変更された場合(属性名、エンティティ名)、リファクタが自動的にJavaソリューションに取り組みます。認める:構造が変わったら、とにかく問題があるだろう。 – sjaak

+0

@tucuxi。私はちょうど私の小さな例を試しました。それは本当に素晴らしいです。 – sjaak

0

私はこれを行うIDEプラグインについて認識していません。私はグーグルで見つけられませんでした。他の人が書いた既存のプラグインがない場合、あなたの質問に対する答え:

これを最も効率的な方法で実現するにはどうしたらいいですか?

は、(!自分を)プラグインを開発するか、単に手でテストケースを書いていきに、より効率的であるかどうかに依存します。

私の推測では、後者のほうが効率的だと思います。


また、@ GhostCat'sに同意します。テストケースが「データ集約型」である場合は、テストデータのテキストベースのシリアル形式を選択/実装し、そのようにテストデータを表現する方がよいでしょう。私の経験では、オブジェクトグラフを構築するためのJava呼び出しの束としてコード化されたテストデータよりも、そのように表現されたテストデータを読み書きする方が簡単です。テストケースが「書き込み専用」ではないことが重要です。

+0

ありがとう。私は上記の解決に行きました。 – sjaak

0

グラフを人間が読める形式で解析できる形式に維持しています。構文が文書間の参照を可能にするので、XMLはあなたの最良の選択かもしれませんが、どんな形式でも動作します - カスタム構文です。これにより、実行時にグラフを永続化して送信し、単体テスト用のテストグラフを簡単に修正して複製することができます。

関連する問題