読者です 読者をやめる 読者になる 読者になる

しおしお

IntelliJのあれやこれや

JSR352-Batch Applicationを試してみた(Batchletをテストしてみた)

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を見てねって教えてあげるために必要なようです。

実行結果

いい感じに動いた!!
f:id:sioiri:20150611232451p:plain

おわり。