現在、EasyMockの最新版は2.3みたいですが、ここに、Seasar2ではバージョン2.2をサポートしていますと書かれているので、2.2をこちらからダウンロードします。
簡単な使い方
まずはimport static org.easymock.EasyMock.*しておきます。
で、メソッドの先頭やsetUpAfterBindFields()などで、モックをつくります。
Service層のテストで、その中で使っているDaoをモックとする場合、
UserDao mock = createMock(UserDao.class);でモックをつくって、
service.dao = mock;でServiceの中のDaoにモックを入れます。
これで、Serviceから呼び出すDaoはモックのDaoが呼び出されるようになります。
モックができたら、モックの振る舞いを記録します。
String loginId = "user";
String password = "pass";
expect(mock.findByLoginIdAndPassword(loginId, password)).andReturn(null);
だと、モックのDaoは「findByLoginIdAndPasswordメソッドが引数"user"・"pass"で呼ばれて、nullを返す」という振る舞いを記録します。
引数の期待値はかなり柔軟に設定できます。isA()でクラスの型までのゆるいチェックにしたり、anyLong()でLongだったら何でもいい、みたいな指定にできたり。
ここらへんに書いてあります。
次に記録したことを再現します。
replay(mock);
UserModel actual = service.findByLoginIdAndPassword(loginId, password);
assertNull(actual);
replay()でリプレイモードというものに入ります。
リプレイモードにしたあとに、実際のテスト対象メソッドを呼びます。
テスト対象メソッドを呼んだあとのassertなどもここでやっておきます。
最後に、検証します。
verify(mock);ここで、リプレイモード時に動作したモックの振る舞いが、振る舞いの記録で記録したとおりに振舞っていないとエラーになります。
なお、次のテストを続ける場合は、
reset(mock);しなければなりません。
感覚がつかめればEasyになる
EasyMockは、ちょっと変わった感じなので、僕も感覚をつかむまではなんだかモヤモヤしていました。
何回かやってみて、感覚さえつかめれば、割とスラスラ書けるようになって、Easyな感覚になってきます。
上には書いていませんが、メソッド呼び出し回数の検証や、IAnswerインタフェースを使えばモックに渡している引数の検証も可能です。
外部diconファイルも不要だし、モックの定義がJavaソースなのでリファクタリングに追随するしで、けっこうイイ感じだと思えてきました。
難点を言えば
エラーになったときのログがわかりずらい、と思う。
パッと見でわからないことが多い、と感じる。
くらいでしょうか。