Arquillianでジョブのテストをしてみる
TweetPosted on Monday Feb 10, 2014 at 06:54PM in Technology
CLIからリモートEJB経由でジョブを操作してみる のところで使ってみたリモートEJB呼び出しとArquillianを使って、ジョブのJUnitテストを書いてみる。ついでにテーブルのデータ検証とかもしてみる
バッチ開発時の雛型プロジェクト的に使えるように若干作り込んでみる
環境
- WildFly8.0.0.CR1
- wildfly-arquillian-container-remote 8.0.0.CR1
- Arquillian Persistence Extension 1.0.0.Alpha6
- Arquillian 1.1.2Final
- Eclipse Kepler SR1
- Oracle JDK7u51
- postgresql-9.3-1100.jdbc41.jar
- PostgreSQL 9.2.6
前提条件
- CLIからリモートEJB経由でジョブを操作してみる で作った資源とかが普通に動いているものとする
- データソースとかJDBCドライバとかも適当にAPサーバ側に定義されて使えるようになっているものとする。ここではArquillian側で定義したデータソースのデプロイとかはやらない。WildFlyでのデータソース定義はこのへんが参考になるかも
準備
資源の配置図
プロジェクト内の資源はこんな感じ。前に作ったjbatchifプロジェクトへの依存が有る。資源の詳細はGitHubのここのjbatchtestプロジェクト参照
MyJobOperatorImpl.java
CLIからリモートEJB経由でジョブを操作してみる で作ったのと同じもの。テストクラスからこのクラスのメソッドがリモートEJBで呼び出され、ジョブの起動やBatchStatusの取得が行われる
FugeEntity.java
IDとfugeっていうフィールドだけの簡単なエンティティ
test.xml
ジョブXML。Stepは1つだけ。fugeUpdateBatchletが走るだけ
FugeUpdateBatchlet.java
FugeEntityをEntityManager#find()で1つ取ってきてfugeフィールドを書き換える超単純なBatchlet
AbstractJobTest.java
テストクラスの親クラス。だいたい以下のような内容が書いてある
- @Deploymentアノテーション付きメソッド。たぶん他のジョブ用のテスト書くときも共通なのでここに置く
- @ResourceアノテーションでリモートEJB経由のJobOperatorの参照を注入させる。JNDI名もここに書かれている
- ジョブの実行が終わるまで1秒間隔でJobExecutionをポーリングするstartJob()メソッドを持つ。テストクラスはこのメソッドを使ってジョブを起動する
TestJobTest.java
テストクラス。Arquillian Persistence Extensionの機能を使う。以下をやる
- テスト実行前のDBへのデータ投入。ファイル名もここに書いてある
- テスト実行後のDB上のデータ検証。ファイル名もここに書いてある
- BatchStatusの検証
arquillian.xml
設定内容は以下
- Arquillian Persistence Extension用のデータソースの指定
- DBのクリーンアップはテスト実行前にやらせる
fugeentity.yml
テスト実行前に投入するデータ
expected.yml
テスト実行後の検証用データ
実行してみる
手順
- APサーバを起動する
- jbatchtestプロジェクトをデプロイ
- TestJobTestを普通にJUnitテストとして実行
テスト結果は普通に緑色になる
APサーバのログ
まあ普通。デプロイする物が少ないせいか割と早い。
16:49:07,091 INFO [org.jboss.as.repository] (management-handler-thread - 223) JBAS014900: Content added at location /Users/kyle/apps/wildfly-8.0.0.CR1/standalone/data/content/1d/b651139b3cf98767bf2bdb8e1cedbfaff7497c/content 16:49:07,092 INFO [org.jboss.as.server.deployment] (MSC service thread 1-4) JBAS015876: Starting deployment of "test.war" (runtime-name: "test.war") 16:49:07,120 WARN [org.jboss.as.dependency.private] (MSC service thread 1-1) JBAS018567: Deployment "deployment.test.war" is using a private module ("org.wildfly.security.manager:main") which may be changed or removed in future versions without notice. 16:49:07,120 INFO [org.jboss.weld.deployer] (MSC service thread 1-5) JBAS016002: Processing weld deployment test.war 16:49:07,126 INFO [org.jboss.weld.deployer] (MSC service thread 1-7) JBAS016005: Starting Services for CDI deployment: test.war 16:49:07,127 INFO [org.jboss.as.arquillian] (MSC service thread 1-7) Arquillian deployment detected: ArquillianConfig[service=jboss.arquillian.config."test.war",unit=test.war,tests=[job.test.TestJobTest]] 16:49:07,127 INFO [org.jboss.weld.deployer] (MSC service thread 1-1) JBAS016008: Starting weld service for deployment test.war 16:49:07,184 INFO [org.wildfly.extension.undertow] (MSC service thread 1-16) JBAS017534: Register web context: /test 16:49:07,191 INFO [org.jboss.as.server] (management-handler-thread - 223) JBAS018559: Deployed "test.war" (runtime-name : "test.war") 16:49:08,638 WARN [org.dbunit.dataset.AbstractTableMetaData] (pool-2-thread-28) Potential problem found: The configured data type factory 'class org.dbunit.dataset.datatype.DefaultDataTypeFactory' might cause problems with the current database 'PostgreSQL' (e.g. some datatypes may not be supported properly). In rare cases you might see this message because the list of supported database products is incomplete (list=[derby]). If so please request a java-class update via the forums.If you are using your own IDataTypeFactory extending DefaultDataTypeFactory, ensure that you override getValidDbProducts() to specify the supported database products. 16:49:08,651 DEBUG [org.hibernate.SQL] (batch-batch - 5) select fugeentity0_.id as id1_0_0_, fugeentity0_.fuge as fuge2_0_0_ from FugeEntity fugeentity0_ where fugeentity0_.id=? 16:49:08,653 DEBUG [org.hibernate.SQL] (batch-batch - 5) update FugeEntity set fuge=? where id=? 16:49:09,660 WARN [org.dbunit.dataset.AbstractTableMetaData] (pool-2-thread-28) Potential problem found: The configured data type factory 'class org.dbunit.dataset.datatype.DefaultDataTypeFactory' might cause problems with the current database 'PostgreSQL' (e.g. some datatypes may not be supported properly). In rare cases you might see this message because the list of supported database products is incomplete (list=[derby]). If so please request a java-class update via the forums.If you are using your own IDataTypeFactory extending DefaultDataTypeFactory, ensure that you override getValidDbProducts() to specify the supported database products. 16:49:09,689 INFO [org.wildfly.extension.undertow] (MSC service thread 1-16) JBAS017535: Unregister web context: /test 16:49:09,690 INFO [org.jboss.weld.deployer] (MSC service thread 1-7) JBAS016009: Stopping weld service for deployment test.war 16:49:09,696 INFO [org.jboss.as.server.deployment] (MSC service thread 1-9) JBAS015877: Stopped deployment test.war (runtime-name: test.war) in 7ms 16:49:09,703 INFO [org.jboss.as.repository] (management-handler-thread - 223) JBAS014901: Content removed from location /Users/kyle/apps/wildfly-8.0.0.CR1/standalone/data/content/1d/b651139b3cf98767bf2bdb8e1cedbfaff7497c/content 16:49:09,703 INFO [org.jboss.as.server] (management-handler-thread - 223) JBAS018558: Undeployed "test.war" (runtime-name: "test.war")
テーブル
まあ普通。
jbatcharts=# select * from fugeentity order by id; id | fuge ----+-------------- 1 | FugeModified 2 | FugeFuge (2 rows)
備考
何か無駄に複雑にしているような気がするが何か他に良いテストの方法ないだろうか。
Tags: jbatch