About

EasyMock

プロジェクト文書

Built by Maven

Abstract

JUnit CDI Extensions for EasyMock は,テストクラスや bean での EasyMock の利用をサポートします.

EasyMock Class Extension も利用可能です. EasyMock Class Extension および CGLIB の Jar ファイルがクラスパスにあれば自動的に EasyMock Class Extension が利用されます.

モックを作成するには,テストクラスや bean クラスのフィールドに org.seasar.junitcdi.easymock.EasyMock アノテーションを指定します.

@RunWith(CDI.class)
public class XxxTest {
    @EasyMock
    XxxService xxxService;
    ...
}

テストクラスや bean のインスタンスが CDI コンテナにより構築されて DI が行われるタイミングで, モックオブジェクトが作成されてフィールドに設定されます.

モックの種類を切り替えるには, EasyMock アノテーションに org.seasar.junitcdi.easymock.EasyMockType を指定します.

@RunWith(CDI.class)
public class XxxTest {
    @EasyMock(EasyMockType.STRICT)
    XxxService xxxService
    ...
}
定数 説明
DEFAULT デフォルトです. モックは指定されていないメソッドが呼び出されると例外をスローしますが,メソッドの呼び出し順は無視します.
STRICT モックは指定されていないメソッドが呼び出されると例外をスローします. 指定されたメソッドであっても,指定された通りの順でメソッドが呼び出されないと例外をスローします.
NICE モックは指定されていないメソッド呼び出しが行われても例外をスローしません.

モックの振る舞いはテストクラスの @Before または @BeforeTest で注釈されたメソッドで記録します.

    @BeforeMethod
    public void beforeTest() {
        expect(mockService.findByName(...)).andReturn(...);
    }
}

テストメソッドでモックを利用したテストを実施します.

    @Test
    public void test() {
        assertThat(mockService.findByName(...), is(...));
    }
}

テストメソッドの実行が成功すると,モックが検証されます. テストメソッドが失敗した場合はモックの検証は行われません.

Produces

モックオブジェクトを bean としてプロデュースすることができます.

@RunWith(CDI.class)
public class HogeTest {
    @EasyMock
    @Produces
    XxxDao xxxDao;
    ...
}

public class XxxService {
    @Inject
    XxxDao xxxDao;
    ...
}

XxxServicexxxDao フィールドにはモックオブジェクトが DI されます.

ただし,クラスパス中にモックオブジェクトと同じ型の bean (上の例では XxxDao ) が存在すると,DI が曖昧で解決できないために例外が発生します. 曖昧さを解決するには, org.seasar.junitcdi.easymock.AlternativeMock で注釈します (詳細は CDI 仕様書の「2.6. Alternatives」を参照してください).

以下の例では,クラスパス中に XxxDao クラスがあっても XxxService にはモックが DI されます.

@RunWith(CDI.class)
public class HogeTest {
    @EasyMock
    @AlternativeMock
    @Produces
    XxxDao xxxDao;
    
    @Inject
    XxxService xxxService;
    ...
}

EasyMockController

テストメソッドの中でモックオブジェクトを作成したり,モックオブジェクトとの記録・再生・検証を繰り返すには, org.seasar.junitcdi.easymock.EasyMockController を使用します. EasyMockController は CDI で管理される bean であるため,DI により入手することができます.

    @Inject
    EasyMockController mockController;

    @Test
    public void test() throws Exception {
        mockController.reset();  // 記録モードに変更
        expected(mock.xxx(...)).andReturn(...);
        ...
        mockController.replay(); // 再生モードに変更
        mock.xxx();
        ...
        mockController.verify(); // 検証

        mockController.reset(); // 記録モードに戻す
        // 繰り返し
        ...
    }

EasyMockController の詳細は Javadoc を参照してください.