JSR352-Batch Applicationを試してみた(BatchletでDBアクセス-JPA編) - しおしお(´・ω・`)で作ったBatchletをArquillianでテストしてみた。
とりあえず、BatchletでJPA使ってるのでhttp://arquillian.org/guides/testing_java_persistence/あたりを見ながら見よう見まねでやってみた。
テスト用のライブラリの追加
Arquillian系のライブラリとGlassfish embeddedでテストを実行するためのライブラリをテストスコープに追加してあげる。
testCompile 'org.jboss.arquillian.junit:arquillian-junit-container:1.0.0.Final' testCompile 'org.jboss.arquillian.container:arquillian-glassfish-embedded-3.1:1.0.0.CR4' testCompile 'org.glassfish.main.extras:glassfish-embedded-all:4.1'
テストコード
ジョブが正常終了するケースと異常終了するケースの2つをやってみてます。
// Arquillianランナーでテストを実行する @RunWith(Arquillian.class) public class DbAccessBatchletTest { // テスト対象のアプリケーションのアーカイブを指定する @Deployment public static Archive<?> createDeployment() { return ShrinkWrap.create(WebArchive.class, "test.war") .addPackages(true, "siosio") .addAsResource("test-persistence.xml", "META-INF/persistence.xml"); } // テストデータのセットアップや検証で使用するJPA関連のクラスをインジェクトする @PersistenceContext EntityManager em; @Inject UserTransaction utx; // セットアップ処理で登録対象のテーブルをクリーニング @Before public void setUp() throws Exception { utx.begin(); final Query query = em.createNativeQuery("delete from USERS"); query.executeUpdate(); utx.commit(); } // 正常に終わるケース // 期待通りのレコード数が登録されていること @Test public void testCompleted() throws Exception { final JobExecution jobExecution = TestHelper.start("db-access-job"); assertThat("正常終了していること", jobExecution.getBatchStatus(), is(BatchStatus.COMPLETED)); final TypedQuery<UserEntity> resultQuery = em.createNamedQuery("findUsersAll", UserEntity.class); final List<UserEntity> result = resultQuery.getResultList(); assertThat("50レコード登録されていること", result.size(), is(50)); } // 異常終了するケース // 一意制約違反が発生するであろうデータを用意してテストを流す。 @Test public void testFailed() throws Exception { utx.begin(); em.persist(new UserEntity(35L, "重複するとおもわれるデータ")); em.persist(new UserEntity(85L, "重複するとおもわれるデータ")); utx.commit(); final JobExecution jobExecution = TestHelper.start("db-access-job"); assertThat("異常終了していること", jobExecution.getBatchStatus(), is(BatchStatus.FAILED)); final TypedQuery<UserEntity> resultQuery = em.createNamedQuery("findUsersAll", UserEntity.class); final List<UserEntity> result = resultQuery.getResultList(); assertThat("登録は失敗するので、初期データの2レコードのみ存在している", result.size(), is(2)); } }
その他のファイル
jbatch-sample/glassfish-resources.xml at master · siosio/jbatch-sample · GitHub
これはテストで使用するDataSourceの設定を記述します。
jbatch-sample/test-persistence.xml at master · siosio/jbatch-sample · GitHub
テストで使用するJPAの設定ファイルです。上記で設定したDataSourceを使用します。
jbatch-sample/arquillian.xml at master · siosio/jbatch-sample · GitHub
Arquillianの設定ファイル?でいいのかな。Arquillianにglassfish-resources.xmlを見てねって教えてあげるために必要なようです。
実行結果
いい感じに動いた!!
おわり。