モックフレームワークの使い分け

ちょっと凝ったexpectationの実現のために

  1. jMock
  2. MockInterceptor
  3. djUnitのVirtual Mock Objects

の3つを使い分けるとうまくいくシーンがありました。モックオブジェクトのフレームワークも別に一つに絞る必要はなくて、いろいろ使い分ければいいのですが、テストケースのソースのほうはよくわかんなくなりがちなので注意です。

そもそもなぜ使い分けるのか?という話がありますが、一長一短あるので、いまのところ以下のような感じです。

  1. どんな引数でどう呼ばれるべきか、というオブジェクト間のインタラクションに細かいexpectationを仕掛けたい場合はjMockを使う
  2. ブラックボックス的なMock(stubに近いか?)を仕掛けたい場合は MockInterceptorを使う(たいていこれ一発でいけます)
  3. new Date() とか new File("hoge.txt")とかしてるメソットをテストする場合は断然djUnitのVirtual mock objects

jUnitとMockInterceptorなら、判りやすさからいって後者なのですが、前者はexpectationとか戻り値の与え方とかかなり自由度があります。そのかわり、インタラクションが開始される前に(テスト対象が呼ばれる前に)がっちりsetしてあげないと駄目なんですが。

この3つの中だと djUnitのVMOは凄くて、

  public static String parseHoge(String filename) {
     File f = new File(filename)
     .
     .
  }

みたいなコードもスラスラテストできます。new File()にInterceptorを仕掛けて、モックを返す…という方法でほとんどどんなコードもテストできます。最近では Runtime.getRuntimeして exec()して作ったProcessの出す出力をInputStreamで開いてパースして…みたいなコードもほとんど苦労なくテストできました。

オススメ。