N2 ToolBox(跡地)

跡地です。引っ越しました。http://d.hatena.ne.jp/nosen

EasyMock vs jMock

2004-05-30 00:01:33 | 開発手法/方法論
昨日もちょっと書きましたが、どちらも動的にMockObjectを生成するタイプのツールであるEasyMockjMockを両方ちょっとだけ試してみました。
機能的には大差なくて、どちらも以下のような事ができます。
  • 動的プロキシの機構を使ったインターフェースのMockObject生成
  • cglibを使った拡張ライブラリによるクラスのMockObject生成
  • 予期されるメソッド呼び出しの設定と検証
  • 予期されるメソッド呼び出しに対する戻り値または例外の設定
予期されるメソッド呼び出しは複数回分を設定できますし、順番を指定することもできます。
違うのは、予期されるメソッド呼び出しの設定方法です。
EasyMockだと以下のようになります。

MockControl ctrl = MockControl.createControl(Foo.class);
//MockObjectの生成
Foo mockFoo = (Foo) ctrl.getMock();
Bar foo = new Bar(mockFoo);

String arg = "arg";
//予期されるメソッド呼び出しの設定
mockFoo.bar(arg);
ctrl.setReturnValue(1);
//テスト開始
ctrl.replay();
int rv = foo.doBar(arg);

jMockだと以下のようになります。
Mock mock = new Mock(Foo.class);
//MockObjectの生成
Foo mockFoo = (Foo) mock.proxy();
Bar foo = new Bar(mockFoo);

String arg = "arg";
//予期されるメソッド呼び出しの設定
mock.expects(once()).method("bar").with(same(arg))
.will(returnValue(1));
//テスト実行
int rv = foo.doBar(arg);

さあ、どちらがわかりやすいでしょうか?
EasyMockはMockObjectに対して予期されるメソッド呼び出しを"記録”するというアプローチです。jMockのやり方は細かいメソッドに分けて予期される動作を設定しており、一見分かりづらいのですが、JavaDocをよ~くながめると、「ふーんなるほど」と納得できます。これはこれでなかなか筋のとおったやり方です。
どっちがいいのか?と言われると難しいのですが、僕はjMockの方が好きですね。EasyMockはぱっと見はわかりやすいのですが、ちょっとややこしいことをやろうとするとすぐごちゃっとしたコードになってしまいそうな気がします。一方jMockは一見分かりづらいのですが、一度理解してしまうと、柔軟性も高いし、複雑な振る舞いもさくっと設定できそうです。そんなに使い込んでないんで、わからないですが。
ただ、ぱっと見のわかりやすさも実際の開発では結構大事なんですよねぇ。以前4人のXPプロジェクトを回したときに、ソースコードを生成するタイプのMockObjectツールを使ったのですが、僕も含めて全員が生成されたMockObjectの使い方が分からなくてハマったという苦い経験があります。
MockObjectというもの自体、うまく使えばテストの効率がすごく向上するけど、使いどころを間違えると大変なことになるものだという気がしています。基本的にはあんまり複雑なインターフェースには適用しない方がよさそうです。HttpServletRequestのMockObjectを作るよりは、素直にコンテナの中でテストしたほうが良いと思います。

最新の画像もっと見る