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;
...
}
XxxService
の
xxxDao
フィールドにはモックオブジェクトが 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
を参照してください.