Cotton Bolls: 期待値のデータ構造の作成
« Name and Conquer | トップページ | Type Safe Enumパターンの謎のクラス »
2004.01.14
期待値のデータ構造の作成
Converterライブラリを使っていると,期待値としてオブジェクトのツリー構造などがほしいときがある.例えば
root ├ sub1 │ ├ sub1-1 │ └ sub1-2 ├ sub2 │ └ sub2-1 │ └ sub2-1-1 └ sub3
というのが期待値だとすると,PropertyクラスとObject配列で次のように書かなければならない.
expected = new Property("root", new Object[] { new Property("sub1", new Object[] { "sub1-1", "sub1-2", }), new Property("sub2", new Object[] { new Property("sub2-1", new Object[] { "sub2-1-1" }), }), "sub3", }); converter.assertEquals(expected, actual);
これだけでも非常に複雑なので,XMLやYAMLで簡単に書けないか考えた.XML版はこんな感じだろうか(p: Property, o:Objectとした)
<?xml version="1.0"?> <!DOCTYPE expected SYSTEM "expected.dtd"> <expected> <p name="root"> <p name="sub1"> <o value="sub1-1"/> <o value="sub1-2"/> </p> <p name="sub2"> <p name="sub2-1"> <o value="sub2-1-1"/> </p> </p> <o value="sub3"/> </p> </expected>
一方YAML版はこんな感じだろうか.
--- root: - sub1: - sub1-1 - sub1-2 - sub2: - sub2-1: sub2-1-1 - sub3
これでもかなり冗長な気がする.テストコード中に埋め込むとなると改行\nを書くのも面倒だ.結局,次のようなPropertyTreeクラスを作ることにした.
PropertyTree pt = new PropertyTree(); pt.add("root"); pt.add(" sub1"); pt.add(" sub1-1"); pt.add(" sub1-2"); pt.add(" sub2"); pt.add(" sub2-1"); pt.add(" sub2-1-1"); pt.add(" sub3"); converter.assertEquals(pt.eval(), actual);
次回のConverterライブラリのバージョンアップに含めようかと思う.そういえば,JMockで使われている方法も試してみたのだった.すごい短い名前のファクトリクラスを使うという方法だ.それを応用するとこんな感じになるだろうか.
expected = E.p("root" E.p("sub1", "sub1-1", "sub1-2"), E.p("sub2", E.p("sub2-1", "sub2-1-1")) "sub3");
かなりすっきりするが,(少なくとも1.4までの)javaは可変長引数が使えないためやめてしまった.子供が5個以上ならnew Object[]に切り替える,というのがいやだったためだ.
12:28 PM in JUnit | 固定リンク
トラックバック
この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/100518
この記事へのトラックバック一覧です: 期待値のデータ構造の作成: