SAStrutsのJUnitテストでActionに自動DIしたい
ActionのJUnitテストをしようとするとActionCustomizerでNullPointerExceptionが発生します。アクションマッピングを作成しようとしているんですが、JUnitテストなのでそいつをセットするModuleConfigがなくて落ちるわけですね。
ちょっと調べてみたところ、ひがさんがテストクラス内でnewして依存性は手動で解決すればぬるぽは発生しなくなりますよとおっしゃってました。でも…DIコンテナなんだから自動でインジェクションしたい!
というわけで、設定で解決してみることにしました。
s2container.dicon
<components> <include condition="#ENV == 'ut'" path="warmdeploy.dicon"/> <include condition="#ENV == 'ct'" path="hotdeploy.dicon"/> <include condition="#ENV == 'jt'" path="warmdeploy.dicon"/> <include condition="#ENV != 'ut' and #ENV != 'ct' and #ENV != 'jt'" path="cooldeploy.dicon"/> </components>
'jt'用の<include>を追加します。別にwarmdeployでなくてもかまいません。
4つ目の<include>に"#ENV != 'jt'"を追加しておかないとcooldeployになってびっくりします(びっくりしました)。
customizer_jt.dicon
<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> </component> <component name="serviceCustomizer" class="org.seasar.framework.container.customizer.CustomizerChain"> <initMethod name="addAspectCustomizer"> <arg>"aop.traceInterceptor"</arg> </initMethod> </component> </components>
customizer.diconではなく、customizer_jt.diconです。暗黙的な条件インクルードというやつです。
ファイル名の後ろに'_jt'とつけておくと、環境変数が'jt'のときはcustomizer.diconではなく、customizer_jt.diconが読み込まれるようになります。こうすればActionCustomizerはCustomizerChainに登録されなくなるのでぬるぽで落ちることはありません。
当然ですが、上に書いたファイルの中身は一例です。ActionCustomizerさえ外しておけば(きっと)動くので、お好みで記述すればいいと思います。