[Seasar-user:19132] [S2JUnit4+S2JDBC]batch.Taskクラスのトランザクションのテストを行うには?

yossy [E-MAIL ADDRESS DELETED]
2010年 1月 15日 (金) 10:43:50 JST


度々お世話になっております。yossyです。

少しずつ慣れてきたところではありますが、
また問題にぶつかったので質問させてください。

javaでバッチ処理(時間になったらDBに複数レコードを保存)をくんでいますが、
以下のようなbatch.taskクラスがあり、このタスクのテストを行いたいと考えています。
(全てのレコードが登録できたらコミット、でなければロールバックしたい)
public class HogeTask implements Task {

    @Resource
    /* テーブルのクラス */
    private HogeEntityService hogeEntityService;

〜中略〜

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void execute() throws Exception {

        for (int i =0; i < n; i++) {
            Hoge(mapData);
        }
    }

    /* DBに書き込む処理 */
    private void Hoge(Map<String, String>) throws Exception {
        hogeEntityService.insertHoge(mapData);
    }
}

このHogeTaskをベースにS2Junit4のテストケースHogeTaskTestとHogeTask.diconを作成し
たのですが、動かしてみると、
DEBUG 2010-01-15 09:53:22,129 [main] 設定ファイル(HogeTest.dicon)をインクルードします
DEBUG 2010-01-15 09:53:22,129 [main] S2Containerを作成します。path=HogeTest.dicon
DEBUG 2010-01-15 09:53:22,145 [main] S2Containerを作成しました。path=HogeTest.dicon
DEBUG 2010-01-15 09:53:22,238 [main]
トランザクションを開始しました。tx=[FormatId=4360, GlobalId=1263516801035/1,
BranchId=]
DEBUG 2010-01-15 09:53:22,270 [main] クラス(HogeTask[hogeTask])のコンポーネント定義を登録します
DEBUG 2010-01-15 09:53:22,442 [main]
クラス(HogeEntityService[hogeEntityService])のコンポーネント定義を登録します
DEBUG 2010-01-15 09:53:22,520 [main] BEGIN HogeTask#init()
DEBUG 2010-01-15 09:53:22,520 [main] END HogeTask#init() : null
DEBUG 2010-01-15 09:53:22,520 [main] BEGIN HogeTask#execute()
DEBUG 2010-01-15 09:53:27,942 [main] END HogeTask#execute() : null
DEBUG 2010-01-15 09:53:27,942 [main] BEGIN HogeTask#dispose()
DEBUG 2010-01-15 09:53:27,942 [main] END HogeTask#dispose() : null
DEBUG 2010-01-15 09:53:27,942 [main]
トランザクションをロールバックしました。tx=[FormatId=4360, GlobalId=1263516801035/1,
BranchId=]
のようになりテスト実行になっていないような気がします。
execute()がnullになっているのが???です。

HogeEntityServiceクラスのinsertHoge単体のテストでは正常に動作しました。
DEBUG 2010-01-15 09:53:21,332 [main]
論理的なコネクションを取得しました。tx=[FormatId=4360, GlobalId=1263516801035/0,
BranchId=]
DEBUG 2010-01-15 09:53:21,348 [main] insert into HOGE (略) values (略)
DEBUG 2010-01-15 09:53:21,410 [main] END
HogeService#insert([E-MAIL ADDRESS DELETED]) : 1
2010-01-15 09:53:21,410 [main] INFO  HogeEntityService - 登録件数:1。
DEBUG 2010-01-15 09:53:21,410 [main] END HogeEntityService#insertHogeTest(略)
DEBUG 2010-01-15 09:53:21,410 [main]
トランザクションをロールバックしました。tx=[FormatId=4360, GlobalId=1263516801035/0,
BranchId=]
DEBUG 2010-01-15 09:53:21,410 [main]
論理的なコネクションを閉じました。tx=[FormatId=4360, GlobalId=1263516801035/0,
BranchId=]

参考までにcustomizer_ut.diconのtaskCustomizerの書き方かと思いましたので挙げてみます。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
	"http://www.seasar.org/dtd/components24.dtd">
<components>
  <include path="default-customizer.dicon"/>
  <component name="formCustomizer"
class="org.seasar.framework.container.customizer.CustomizerChain"/>
  <component name="actionCustomizer"
class="org.seasar.framework.container.customizer.CustomizerChain">
    <initMethod name="addAspectCustomizer">
      <arg>"aop.traceInterceptor"</arg>
    </initMethod>
    <initMethod name="addAspectCustomizer">
      <arg>"actionMessagesThrowsInterceptor"</arg>
    </initMethod>
    <initMethod name="addCustomizer">
      <arg>
        <component
class="org.seasar.framework.container.customizer.TxAttributeCustomizer"/>
      </arg>
    </initMethod>
  </component>
  <component name="serviceCustomizer"
class="org.seasar.framework.container.customizer.CustomizerChain">
    <initMethod name="addAspectCustomizer">
      <arg>"aop.traceInterceptor"</arg>
    </initMethod>
    <initMethod name="addCustomizer">
      <arg>
        <component
class="org.seasar.framework.container.customizer.TxAttributeCustomizer"/>
      </arg>
    </initMethod>
  </component>
  <component name="taskCustomizer"
class="org.seasar.framework.container.customizer.CustomizerChain">
    <initMethod name="addAspectCustomizer">
      <arg>"aop.traceInterceptor"</arg>
    </initMethod>
    <initMethod name="addCustomizer">
      <arg>
        <component
class="org.seasar.framework.container.customizer.TxAttributeCustomizer"/>
      </arg>
    </initMethod>
  </component>
</components>

見辛いと思いますが、このようなケースでのテストのやり方を
どなたかおわかりになられましたらご教授いただければと思います。


Seasar-user メーリングリストの案内