S2Junit4/非seasar2系プロジェクトでS2Junit4を使う

S2Junit4/非seasar2系プロジェクトでS2Junit4を使う

かなり適当。あくまで個人のマシンでの開発に使うぐらいかな。

データソース問題

既存のプロジェクトがDBへの接続のためのDataSourceを独自管理していた場合、S2 の JdbcManager 管理の DataSource とズレてしまうのでトランザクション管理ができなくなってしまう。

なのでS2側でぶち込んだデータが別トランザクションからは見れなくなってしまってテストにならないし、切ってしまうとテスト後にロールバックしないという問題が・・・

既存のプロジェクトがDBへの接続のためのDataSourceを独自管理(使い終わったタイミングでコネクションをcloseしてしまうとか)していた場合に PreparedStatement::isClosedとかを呼び出していると何故かコケてしまうのでこの点は回避する必要がある

JdbcManager からは

JdbcManagerImplementor implementor = (JdbcManagerImplementor)jdbcManager;
DataSource ds = implementor.getDataSource();

このようにDataSourceが取得できるようである。これはまだbefore の段階ではjdbcManagerはインジェククションされてないようなのでメソッドの頭で呼び出す形になる。 一行書くコストと、テストしないという選択肢を天秤にかけるまでもないだろ。

設定ファイルの用意

src/test/resources を作ってビルドパスに追加する(Eclipse のプロジェクト設定)

src/text/resources に 必要な dicon ファイルを作る。これは既存の SAStruts とかのプロジェクトから持ってくればいいだろう

app.dicon
<?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="convention.dicon"/>
    <include path="aop.dicon"/>
    <include path="j2ee.dicon"/>
    <include path="s2jdbc.dicon"/>
</components>

パッケージ名は適宜直す

convention.dicon
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd">
<components>
    <component class="org.seasar.framework.convention.impl.NamingConventionImpl">
        <initMethod name="addRootPackageName">
            <arg>"hoge.piyo.fuga"</arg>
        </initMethod>
    </component>
    <component class="org.seasar.framework.convention.impl.PersistenceConventionImpl"/>
</components>
creator.dicon
<?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="convention.dicon"/>
    <include path="customizer.dicon"/>
</components>
customizer.dicon
<?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"/>
</components>

これ必要かどうかわからんw

env_ut.txt
ut
jdbc.dicon
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd">
<components namespace="jdbc">
    <include path="jta.dicon"/>
    <!-- MySQL -->
    <component name="xaDataSource" class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
        <property name="driverClassName">"com.mysql.jdbc.Driver"</property>
        <property name="URL">"jdbc:mysql://localhost:3306/hogehoge?characterEncoding=utf8"</property>
        <property name="user">"root"</property>
        <property name="password">"hogehoge"</property>
    </component>
    <component name="connectionPool" class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl">
        <property name="timeout">600</property>
        <property name="maxPoolSize">10</property>
        <property name="allowLocalTx">true</property>
        <destroyMethod name="close"/>
    </component>
    <component name="DataSource" class="org.seasar.extension.dbcp.impl.DataSourceImpl" />
</components>
s2container.dicon
<?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 condition="#ENV == 'ut'" path="warmdeploy.dicon"/>
    <include condition="#ENV == 'ct'" path="hotdeploy.dicon"/>
    <include condition="#ENV != 'ut' and #ENV != 'ct'" path="cooldeploy.dicon"/>
</components>
s2jdbc.dicon
<?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="jdbc.dicon"/>
    <include path="s2jdbc-internal.dicon"/>
    <component name="jdbcManager" class="org.seasar.extension.jdbc.manager.JdbcManagerImpl">
        <property name="maxRows">0</property>
        <property name="fetchSize">0</property>
        <property name="queryTimeout">0</property>
        <property name="dialect">mysqlDialect</property>
    </component>
</components>
s2junit4.dicon
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd">
<components namespace="s2junit4">
    <component name="context" class="org.seasar.framework.unit.impl.InternalTestContextImpl"/>
    <component class="org.seasar.framework.unit.impl.DataAccessorImpl"/>
    <component class="org.seasar.framework.unit.impl.ConfigFileIncluderImpl">
        <initMethod name="addConfigFile">
            <arg>"app.dicon"</arg>
        </initMethod>
        <initMethod name="addConfigFile">
            <arg>context.testClassShortName + ".dicon"</arg>
        </initMethod>
    </component>
    <component class="org.seasar.framework.unit.impl.TestDataPreparerImpl">
        <initMethod name="addTestDataXlsPath">
            <arg>context.testClassShortName + "_" + context.testMethodName + ".xls"</arg>
        </initMethod>
        <initMethod name="addTestDataXlsPath">
            <arg>context.testClassShortName + ".xls"</arg>
        </initMethod>
    </component>
    <component class="org.seasar.framework.unit.impl.ExpectedDataReaderImpl">
        <initMethod name="addExpectedDataXlsPath">
            <arg>context.testClassShortName + "_" + context.testMethodName + "_Expected" + ".xls"</arg>
        </initMethod>
    </component>
</components>

必要なライブラリのロード

pom.xml に追記する

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.28</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.4</version>
            <type>jar</type>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-library</artifactId>
            <version>1.3</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.seasar.container</groupId>
            <artifactId>s2-framework</artifactId>
            <version>2.4.47</version>
        </dependency>
 
        <dependency>
            <groupId>org.seasar.container</groupId>
            <artifactId>s2-tiger</artifactId>
            <version>2.4.47</version>
        </dependency>
        <dependency>
            <groupId>org.apache.geronimo.specs</groupId>
            <artifactId>geronimo-jta_1.1_spec</artifactId>
            <version>1.0</version>
        </dependency>
 
        <dependency>
            <groupId>org.apache.geronimo.specs</groupId>
            <artifactId>geronimo-jpa_3.0_spec</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.geronimo.specs</groupId>
            <artifactId>geronimo-ejb_3.0_spec</artifactId>
            <version>1.0</version>
            <scope>test</scope>
        </dependency>
s2/s2junit4/how_to_use_s2junit4_at_non_seasar2_project.txt · 最終更新: 2017-09-26 19:11 by ore