[Seasar-user:18431] S2コンテナ作成している場合のJUnit

TAKEUCHI Shinichi [E-MAIL ADDRESS DELETED]
2009年 9月 2日 (水) 22:13:35 JST


お世話になります、工楽房(Korabo)の竹内ともうします。

   バッチアプリケーションをSeasarにて作成しているのですが、
コマンドラインで指定された引数からDiconのpathを取 
得して
Containerを生成し、その内容(内部のComponentと子 
Container)
を動的にマージして動作させるようになっています。
 単純な動的インクルードではだめな理由は、指定のDiconか 
ら生成される
ComponentからSmartDepolyで自動生成されたComponent 
を利用したいからです。
(Seasarでは子供から親のComponentは見えない)
   これを実現するために、実行時にS2Containerを独自に作成し、
マージの処理をして、SingletonS2Containerに登録し、最後に 
Container
のinit()を実行しています。
 これをS2JUnit4で動作させる場合、s2junit4.dicon 
からは、app.dicon
やバッチ系のdiconには一切のincludeがないた 
め、Containerが全くの
別空間になってしまいました。これが原因だと推定しているのですが、
テスト時に問題が発生してしまったため、、以下のように始めから 
存在する
場合は、それを新規作成したものにインクルードするようにして動 
かしています。

 ここで質問なのですが、
1)こうした方式でS2Containerを生成して実行する場合のテ 
ストとしては、
  この方法が適切なのでしょうか? それとも何かの設定が 
あるのでしょうか?
2)この方式は@RootDicon(app.dicon)などと指定した場合と
  (マージを除けば)同じ効果と言えるのでしょうか。

---------- コードの一部 ----------
  public static String CONFIG_PATH = "app.dicon";
  private static S2Container containerOrg;
  private static S2Container container;

  public static void createRoot(String... appendPath) {
   containerOrg = SingletonS2ContainerFactory.getContainer();
   if (containerOrg != null) {
     // perv. set, use
     mainTask = false;
   }
   // create new
   container = S2ContainerFactory.create(CONFIG_PATH);
   if (containerOrg != null) {
     container.include(containerOrg);
   }
   for (String path : appendPath) {
     if (pathList.contains(path)) {
       continue;
     } else {
       pathList.add(path);
     }
       appendContainer(container, path);
     }
   }
   // IMPORTANT: must set to default container for auto DI
   SingletonS2ContainerFactory.setContainer(container);
}

  public static void appendContainer(S2Container icontainer, String  
configPath) {
   final S2Container s2c = S2ContainerFactory.create(configPath);
   // register include dicon to given
   S2Container child;
   for (int i = 0; i < s2c.getChildSize(); i++) {
     child = s2c.getChild(i);
     if (icontainer.hasDescendant(child.getPath())) {
       continue;
     } else {
       S2ContainerFactory.include(icontainer, child.getPath());
     }
   }
   // register components to given
   ComponentDef component;
   for (int i = 0; i < s2c.getComponentDefSize(); i++) {
     component = s2c.getComponentDef(i);
     component.setContainer(null);
     icontainer.register(component);
    }
   }
  }


よろしくお願いします。
--
竹内 伸一 / (有)工楽房
TAKEUCHI Shinichi / Korabo Inc.





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