モックフレームワークの使い分け
ちょっと凝ったexpectationの実現のために
の3つを使い分けるとうまくいくシーンがありました。モックオブジェクトのフレームワークも別に一つに絞る必要はなくて、いろいろ使い分ければいいのですが、テストケースのソースのほうはよくわかんなくなりがちなので注意です。
そもそもなぜ使い分けるのか?という話がありますが、一長一短あるので、いまのところ以下のような感じです。
- どんな引数でどう呼ばれるべきか、というオブジェクト間のインタラクションに細かいexpectationを仕掛けたい場合はjMockを使う
- ブラックボックス的なMock(stubに近いか?)を仕掛けたい場合は MockInterceptorを使う(たいていこれ一発でいけます)
- 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で開いてパースして…みたいなコードもほとんど苦労なくテストできました。
オススメ。