Challenge Engineer Life !

エンジニア人生を楽しみたい!仕事や趣味で学んだ技術的なことを書いていくブログです。

Arquillianで日本語メソッドのテストが実行できない…

早速ですが、冬休みに学んだことを昨年末に作ったプロトタイプへ反映してみました。
JUnitは問題なしですが、Arquillianでのテストでは問題が2つほど…orz

Arquillianの環境設定の手順をまだ書いてないままですが、自分向けメモって感じで…。

注入できないと怒られてDeployに失敗する問題

昨日のエントリレベルのテストコードをプロトタイプでも書いて、テスト実行しましたが、とりあえずdeployにこけました。

ArquillianServletRunner not found. Could not determine ContextRoot from ProtocolMetadata, please contact DeployableContainer developer.

という、よくわからないエラーが。
スタックトレースみると

PlainTextActionReporterFAILUREDescription: deploy AdminCommandError occurred during deployment: Exception while loading the app : WELD-001408 Unsatisfied dependencies for type [IMessageDigest] with qualifiers [@Default] at injection point [[field] @Inject jp.co.hoge.hogehoge.controller.DatabaseAuthController.messageDigest]. Please see server.log for more details.

と、dependenciesに満足していない様子。beans.xmlに書いてるのがみえてない感じ…。
war固めるソースはこんな感じでした。

@Deployment
public static Archive createDeployment(){
    return ShrinkWrap.create(WebArchive.class, "OpportunityListBeanTest.war").
        addPackage(LogExceptionInterceptor.class.getPackage()).
        // ...
        // 必要なパッケージを繰り返し加える
        // ...
        addAsResource("META-INF/persistence.xml").
        addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml");
    }

ってか、Arquillianのサイトにあるサンプルレベルで書いてるので、いかんすね…。で、調べた所、やはりbeans.xmlを指定する方法が。

ここ↓

addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml");

こんな感じ↓にすると(mavenで作ってれば)通常使っているbeans.xmlをみてくれてデプロイ成功&テスト実行できました。やったー。

addAsWebInfResource(new File("src/main/webapp", "WEB-INF/beans.xml"));

日本語メソッドのテストが実行できない問題

Arquillianだって日本語メソッドでテストするー、と思って書いたら…動かない。マジですか。

英語メソッドだと問題なく動いているのに…
f:id:kikutaro777:20130107194523j:plain

日本語メソッドにするとアウトって悲しすぎです。どこかで文字化けちゃって内部でメソッド名が見つからない感じのエラーです。うーむ。
f:id:kikutaro777:20130107194551j:plain

別途要調査…。新年早々「英語メソッドでもいいじゃない」と悪魔がささやいている…が、Java EEではArquillianのテストは絶対使えそうなのであきらめたくない…。

Arquillian Persistence Extensionを触ってみる

昨日のエントリで、Arquillianを利用してDBUnitのようにdatasetのxmlを定義したり、Unitilsの@DataSetアノテーションでデータを読むみたいなことが簡単にできれば…なんて書いていたのですが、Arquillian Persistence Extensionというものがあって、まさにそのようなものみたいです(^^;すごいなぁ。

試してみた所、簡単なサンプルは無事に動きました。詳細な手順は別途まとめるとして、こんな感じのことができました、というメモ。

テスト用DBデータの準備

DB使ったテストするためにレコードデータをxmlファイルに定義します。
以下ではサンプルとしてIDと名前だけある名簿テーブルを定義してます。

<?xml version="1.0" encoding="UTF-8"?>
<dataset>
    <mymeibo id = "0001" name = "horikita" />
    <mymeibo id = "0002" name = "makimaki" />
</dataset>

テストコード

以下みたいなのを書いただけです。
idが0002のEntity取得したらmakimakiが入ってる?、レコードは2行取れた?という確認だけ。

@Test
@UsingDataSet("dataset.xml")
public void tryDataSetTest(){
    MyMeibo myMeibo = meibo.find(0002);
    assertThat(myMeibo.getName(), is("makimaki"));
    assertThat(meibo.count(), is(2));
}

実行結果

f:id:kikutaro777:20130106233117j:plain

何か設定したわけでもないけど、終わった後にレコードも削除されてるし*1
面白そう、というか、リアルにこれを使ってみようかと思い始めたので暫く触っていきたいと思います。

*1:なので、元々データが入っているテーブルでテストする際は注意が必要です!!

にほんブログ村 IT技術ブログへ
にほんブログ村 にほんブログ村 IT技術ブログ Javaへ
にほんブログ村