目的
- Javaのユニット試験はモックが多いが、どうやらそれ以外のアプローチがあるのでそれを記載したい。
arquillianとは
- ユニット試験ではビジネスロジックなどのクラスをモックに差し替えて、処理を行わないようにしたり、期待する戻り値を返すようにすることが多い。
- arquillianは上記モックを使わず、実際の試験環境を模倣することにより、試験することを主眼に置いている。
- ここでは実際の試験環境はtomcatなどのサーブレットコンテナやアプリケーションサーバ上にWARをデプロイすることが多い。
- arquillianの主な機能は以下の2つ。詳細は「Arquillian Invasion!」参照。
- コンテナのライフサイクル管理機能
- コンテナの起動・終了など
- サーブレットコンテナやアプリケーションサーバを模倣するか、または外部のJAR(Tomcatなど)を呼びだす
- コンテナ上にJAR、WARまたはEARをデプロイする機能
arquillianの特徴
- 実際に動かして試験ができること。
- モックを使わないので、実際にどう動くかがわかるようになる
- IDEと統合
- 依存性注入、特にCDIやEJPに対応。
- Arquillian Droneの使用により、ブラウザの試験が可能。
- デバッグが容易。同じJVM上で動作するので、リモートデバッグが不要。
- コンテナに依存しない。他のコンテナへの差し替えて試験することも容易。
内部クラスについて
- テストコードにてJARやWARに対応するクラスを作成する。JARクラスにテスト対象のクラスを追加する。
- JARの場合、抽象化したArchiveインターフェースを実装したJavaArchiveクラスで表現する。
- Archiveインターフェースはファイルやフォルダを表現したNodeインターフェースを持つ。
- Nodeインターフェースはファイルの中身を表現するAssetインターフェースを持つ。
- Assetインターフェースを実装した各クラスにより実際のファイルの中身を表現する。
- @Deployment のアノテーションを使ってコンテナにデプロイする。
@RunWith(Arquillian.class)
public class GreeterTest {
@Deployment
public static JavaArchive createDeployment() {
return ShrinkWrap.create(JavaArchive.class)
.addClass(Greeter.class)
.addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
}
@Inject
Greeter greeter;
@Test
public void should_create_greeting() {
Assert.assertEquals("Hello, Earthling!",
greeter.createGreeting("Earthling"));
greeter.greet(System.out, "Earthling");
}
}
- コンテナに対応する依存関係(コンテナ自身とコンテナアダプタ)をクラスパスに追加する。クラスパスを自動的に検索してコンテナを探すので、複数のコンテナを定義してはいけない。
<!-- clip -->
<dependency>
<groupId>org.jboss.arquillian.container</groupId>
<artifactId>arquillian-weld-ee-embedded-1.1</artifactId>
<version>1.0.0.CR9</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jboss.weld</groupId>
<artifactId>weld-core</artifactId>
<version>2.3.5.Final</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.6.4</version>
<scope>test</scope>
</dependency>
<!-- clip -->
続き