m-namikiの日記

おもしろき こともなき世を おもしろく

s2junit4での@Mockの使い方

s2junit4を使ったSAStrutsのActionクラスのテストでServiceクラスをMockにする方法がドキュメントを読んでみてもイマイチピンとこなかったので実際に作ってみた。

@RunWith(Seasar2.class)
public class LoginActionTest {

    // テスト対象クラスです。
    private LoginAction action;

    // Mock化するServiceクラスです。
    private EmployeeService employeeService;

    /**
     * 各テストケース実行前の初期化処理です。
     * 
     * @throws Exception
     *             何らかの例外が発生した場合
     */
    public void before() throws Exception {
        action = new LoginAction();
        action.loginForm = new LoginForm();
    }

    /**
     * {@link com.example.action.LoginAction#doLogin()}のテストケースです。<br>
     * このケースではログインが正常に行われた場合の挙動を検証します。
     * 
     * @throws Exception
     *             何らかの例外が発生した場合
     */
    @Test
    @Mock(target = EmployeeService.class, pointcut = "loginAuth", returnValue = "new com.example.entity.Employee()")
    public void testDoLogin() throws Exception {
        action.employeeService = this.employeeService;
        assertEquals("/menu/?redirect=true", action.doLogin());
    }
}

フィールドのemployeeService自体はs2コンテナによって自動バインドされるが、testDoLogin()に@Mockを指定しているので、employeeServiceにはMockInterceptorが適用される。
実際に動かしてみるとドキュメントに書いてある通りなんだけど、ドキュメントのサンプルコードを見ただけだとあんまりイメージ出来なかった。こういうところはSeasarを初めて使ってみようという人には敷居が高いかも。