EasyMockを使ったテスト

JUnit + EasyMockを使ってテストをして見たので、そのときのメモ。

JUniteclipseに入ってるものを使用。EasyMockはこちらから最新版をダウンロードして、クラスパスを設定。

例として、ServiceやLogic、Dao等のクラスを保持するActionクラス(LoginAction)をテストする場合。
LoginActionのauthメソッドのテスト。

  • LoginActionのテストクラス(LoginActionTest)を作成。
  • EasyMockをstatic importしておく。
  • LoginActionTestクラスにsetupメソッドを作成。@beforeアノテーションをつけて、テスト前にmockを生成する。
private LoginAction target;

private LoginDao loginDao;

@before
public void setup() {
    target = new LoginAction;
    loginDao = createMock(LoginDao.class);
}
  • loginTestメソッドでauthメソッドのテストを行う。@testアノテーションをつける。
@test
public void authTest() {

...
}
  • loginTestメドッド内で、mockの定義を記述し、それがその通りに実行されているかチェックする。
// LoginDao.find(Stirng userid, String password)はuser1を返却する。
User user1 = new User();
user1.setUserid = "suusuke";
user1.setPass = "pass";
expect(loginDao.find("suusuke", "pass")).andReturn(user1);

// モックオブジェクトを再生状態にする。
replay(loginDao);

// ログインが成功する事を確認。
assertEquals(target.auth("suusuke", "pass"), true);

// 検証
verify(mock);


これで簡単にLoginActionのテストができます。


その他、知ってると便利なEasyMockの使い方。

  • メソッドの呼び出し回数を指定
// userDao.remove(user) を3回呼び出す。
expect(userDao.remove(user)).times(3);
  • Exceptionをスローする
// userDao.remove(null) の場合NoDataExceptionがスローされる。
expect(userDao.remove(null)).antThrow(new NoDataException);
  • Argument Matcher を使用した期待値の設定。

オブジェクトを引数にもつメソッドのmockなんかを作るときに、テストクラスとテスト対象クラスで引数ののインスタンスが違うせいで、テストに失敗してしまう事がある。

そんなときは、Argument Matcher を使用して制限を緩める。

例えば、上の引数のインスタンスの違いを無視したい場合。

User user = new User();
user.setName = "suusuke";
expect(userDao.insert(not(same(user)))).antReturn(user);


とする事で、テストクラスのuserインスタンスと、テスト対象クラスのuserインスタンスが異なっても、userDao.insertの実行が引数の違いで、テストに失敗するという事が無くなる。


5/26現在、EasyMock2.2の日本語解説サイトが終了しているみたい。どうしても、参照したい場合はGoogleで検索し、キャッシュから見ましょう。