[Seasar-user:5103] [S2Unit]コンテナをcreateするクラスのテストについて

Minoru Taki [E-MAIL ADDRESS DELETED]
2006年 11月 14日 (火) 19:50:26 JST


瀧です。

 長文につき失礼します。

 S2Unitのトランザクションのテストについて分からないことがありますので、
 アドバイスをお願いします。(お助け下さい)

 S2TestCaseのテスト中(Tx)でreadXlsAllReplaceDb等で反映した後に、
 Daoを使用して検索するとテストがOKなのですが、
 コンテナを新たにcreateするクラスではj2ee.requiredTxを設定しても
 別トランザクションとなるようで、正しくテスト結果が得られません。
 これは仕様でしょうか?(使い方が間違っているのでしょうか?)
 それとも、readXlsAllReplaceDbやreadXlsWriteDBメソッドは
 DAOのテスト用(=コンテナをcreateするクラスでは利用できない)
 ということなのでしょうか?

 確かめたソースを下記に記載します。

--  app.dicon  ----------------------------------------------------------------------
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN"
"http://www.seasar.org/dtd/components.dtd">

<components namespace="sample">
 <include path="aop.dicon"/>
 <include path="dao.dicon"/>
 <include path="j2ee.dicon"/>
 
 <!-- コンポーネント自動登録 -->
    <component class="org.seasar.framework.container.autoregister.FileSystemComponentAutoRegister">
        <initMethod name="addClassPattern">
            <arg>"hoge"</arg>
            <arg>".*BusinessImpl,.*Dao"</arg>
        </initMethod>
    </component>
    
 <!-- アスペクト自動登録(ビジネスクラス用) -->
 <component  class="org.seasar.framework.container.autoregister.AspectAutoRegister">
        <property name="interceptor">j2ee.requiredTx</property>
        <property name="pointcut">"execSearch"</property>
        <initMethod name="addClassPattern">
            <arg>"hoge"</arg>
            <arg>".*BusinessImpl"</arg>
        </initMethod>
    </component>

 <!-- アスペクト自動登録(DAO用) -->
    <component  class="org.seasar.framework.container.autoregister.AspectAutoRegister">
        <property name="interceptor">interceptor</property>
        <initMethod name="addClassPattern">
            <arg>"hoge"</arg>
            <arg>".*Dao"</arg>
        </initMethod>
    </component>

</components>
--  BusinessIF.java  ----------------------------------------------------------------------
package hoge;

import java.util.ArrayList;

public interface BusinessIF {
 
     public ArrayList execSearch(BaseDataIF data) throws Exception;
}
--  BusinessImpl.java  ----------------------------------------------------------------------
package hoge;

import java.util.ArrayList;

import org.seasar.framework.container.S2Container;
import org.seasar.framework.container.factory.S2ContainerFactory;

public class BusinessImpl implements BusinessIF{
 
 public ArrayList execSearch(BaseDataIF param) throws Exception{

  ArrayList list;
  
  S2Container container = S2ContainerFactory.create("app.dicon");
  container.init();

  try{
   SampleDao dao = (SampleDao)container.getComponent(SampleDao.class);
 
   list = dao.select((SampleDto)param);

  } finally {
   container.destroy();
  }
  
  return list;
 }
}
--  SampleDao.java  ----------------------------------------------------------------------
package hoge;

import java.util.ArrayList;

public interface SampleDao {

 public Class BEAN = SampleDto.class;
 
 public ArrayList select(SampleDto data);
}
--  BaseDataIF.java  ----------------------------------------------------------------------
package hoge;

public interface BaseDataIF {

}
--  SampleDto.java  ----------------------------------------------------------------------
package hoge;

public class SampleDto implements BaseDataIF{

 public static final String TABLE = "SAMPLE";
 
 private String USER_ID;
 
 private String USER_NAME;

 public String getUSER_ID() {
  return USER_ID;
 }

 public void setUSER_ID(String user_id) {
  USER_ID = user_id;
 }

 public String getUSER_NAME() {
  return USER_NAME;
 }

 public void setUSER_NAME(String user_name) {
  USER_NAME = user_name;
 }
}
--  BusinessTest.java  ----------------------------------------------------------------------
package hoge;

import java.util.ArrayList;

import org.seasar.extension.unit.S2TestCase;

public class BusinessTest extends S2TestCase {

 private static final String PATH = "app.dicon";
 
 private BusinessImpl biz;
 
 private SampleDao dao;
 
 protected void tearDown() throws Exception {
 }
 
 public BusinessTest(String name){
  super(name);
 }
 
 protected void setUp() throws Exception {
  include(PATH);
 }
 
 public void testCase1Tx(){
  
  try{
   readXlsAllReplaceDb("testCase1.xls");

   SampleDto param = new SampleDto();
   param.setUSER_ID("000001");
   
   //DAO直読み
   ArrayList list1 = dao.select(param);
   
   //NULLチェック
   assertNotNull(list1);
  
   //n件
   assertTrue(list1.size() > 0); ////★ここではOK

  
   //ビジネスロジック経由
   ArrayList list2 = (ArrayList)biz.execSearch(param);
  
   //NULLチェック
   assertNotNull(list2);
  
   //n件
   assertTrue(list2.size() > 0); ////★ここではNG(0件)

    
   } catch (Exception e) {
         fail();
   }
 }
}
--  testCase1.xls  ----------------------------------------------------------------------
USER_ID,USER_NAME
000001,hoge taro
000002,hoge jiro

--  テーブルのDDL  ----------------------------------------------------------------------
CREATE TABLE SAMPLE (
    USER_ID                   CHAR(6) ,
    USER_NAME                 VARCHAR2(20) ,
    PRIMARY KEY (USER_ID)
    );




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