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
この記事へのトラックバック一覧です: 期待値のデータ構造の作成:
