menu
書いてる野郎
orebike@gmail.com
かなり適当。あくまで個人のマシンでの開発に使うぐらいかな。
既存のプロジェクトが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 とかのプロジェクトから持ってくればいいだろう
<?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>
パッケージ名は適宜直す
<?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>
<?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>
<?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
ut
<?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>
<?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>
<?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>
<?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>