Skip to content.

Sections
Personal tools
You are here: Home » コミュニティ » masarl memorial » masarl.cocolog-nifty.com » main » 2004 » 01 » Cotton Bolls: 期待値のデータ構造の作成

Cotton Bolls: 期待値のデータ構造の作成

Document Actions

« 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

この記事へのトラックバック一覧です: 期待値のデータ構造の作成:

コメント

コメントを書く