サンプルプロジェクトはこちら S2JUnit4Exam.zip
(ビルドや実行には Eclipse + m2plugin が必要です)
BEGIN テスト対象の実行() COMMIT
BEGIN テストデータの投入 テスト対象の実行() 照合 ROLLBACK
<?xml version="1.0" encoding="UTF-8"?><project> <modelVersion>4.0.0</modelVersion> <groupId>S2DAOExam</groupId> <artifactId>S2DAOExam</artifactId> <version>0.0.1-SNAPSHOT</version> <description></description> <build> <finalName>S2DAOExam</finalName> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.5</source> <target>1.5</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build> <repositories> <repository> <id>maven.seasar.org</id> <name>The Seasar Foundation Maven2 Repository</name> <url>http://maven.seasar.org/maven2</url> </repository> <repository> <id>maven2-repository.dev.java.net</id> <name>Java.net Maven 2 Repository</name> <url>http://download.java.net/maven/2</url> </repository> <repository> <id>maven-repository.dev.java.net</id> <name>Java.net Maven 1 Repository (legacy)</name> <url>http://download.java.net/maven/1</url> <layout>legacy</layout> </repository> </repositories> <dependencies> <dependency> <groupId>org.seasar.container</groupId> <artifactId>s2-tiger</artifactId> <version>2.4.32</version> </dependency> <dependency> <groupId>org.seasar.dao</groupId> <artifactId>s2-dao-tiger</artifactId> <version>1.0.49</version> </dependency> <dependency> <groupId>org.apache.derby</groupId> <artifactId>derby</artifactId> <version>10.3.1.4</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.3</version> <scope>provided</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.15</version> <exclusions> <exclusion> <artifactId>jmxtools</artifactId> <groupId>com.sun.jdmk</groupId> </exclusion> <exclusion> <artifactId>jmxri</artifactId> <groupId>com.sun.jmx</groupId> </exclusion> <exclusion> <artifactId>jms</artifactId> <groupId>javax.jms</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>javax.transaction</groupId> <artifactId>transaction-api</artifactId> <version>1.1</version> </dependency> <dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.7.0</version> </dependency> <dependency> <groupId>org.apache.geronimo.specs</groupId> <artifactId>geronimo-jpa_3.0_spec</artifactId> <version>1.1</version> </dependency> <dependency> <groupId>org.apache.geronimo.specs</groupId> <artifactId>geronimo-jta_1.1_spec</artifactId> <version>1.1</version> </dependency> <dependency> <groupId>org.apache.geronimo.specs</groupId> <artifactId>geronimo-ejb_3.0_spec</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>org.apache.derby</groupId> <artifactId>derbyclient</artifactId> <version>10.3.1.4</version> </dependency> </dependencies> </project>
<?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"/> <include path="jdbc-extension.dicon"/> <component class="org.seasar.extension.jdbc.impl.BasicResultSetFactory"/> <component class="org.seasar.extension.jdbc.impl.ConfigurableStatementFactory"> <arg> <component class="org.seasar.extension.jdbc.impl.BasicStatementFactory"/> </arg> <property name="fetchSize">100</property> <!-- <property name="maxRows">100</property> --> </component> <!-- ********** Derby Embedded ********** <component name="xaDataSource" class="org.seasar.extension.dbcp.impl.XADataSourceImpl" instance="singleton" autoBinding="auto"> <property name="driverClassName"> "org.apache.derby.jdbc.EmbeddedDriver" </property> <property name="URL"> "jdbc:derby:/Users/atsushi/Documents/mydb/data;create=false" </property> </component> --> <!-- Derby Network Client --> <component name="xaDataSource" class="org.seasar.extension.dbcp.impl.XADataSourceImpl" instance="singleton" autoBinding="auto"> <property name="driverClassName"> "org.apache.derby.jdbc.ClientDriver" </property> <property name="URL"> "jdbc:derby://localhost:1527//Users/atsushi/Documents/mydb/data;create=false" </property> </component> <component name="connectionPool" class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl" instance="singleton" autoBinding="auto"> <property name="timeout">600</property> <!-- ********** for Embedded Derby ********** <property name="maxPoolSize">0</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" instance="singleton" autoBinding="auto"/> </components>
CustomerDao?#findByAddress?() をテストする。(実際には Service や Model をテストするが、話がややこしくなるので今回は Dao のメソッドをテストする)
@S2Dao(bean = CustomerBean.class) public interface CustomerDao { (中略) /** * select処理. @Query アノテーション で、複雑なWHERER句 ORDER BY句を記述することができます。 * * @param id ID * @return Customer */ @Query("ADDRESS LIKE /*address*/") List<CustomerBean> findByAddress(final String address); (中略) }
※なんか Query 間違ってました・・・Seasar S2Dao-Tiger、Seasar S2Tiger の続きでサンプルコードをいじっている人は要注意
<?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="app.dicon"/> </components>
テストメソッドの命名規約や起動順序の詳細については、下のサンプルに目を通してから、Seasar Projectのサイト( http://s2container.seasar.org/2.4/ja/S2JUnit4.html )を読むとわかりやすい
package com.snail.exam.s2dao.test; import static org.seasar.framework.unit.S2Assert.assertEquals; import java.util.List; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.seasar.extension.dataset.DataSet; import org.seasar.extension.dataset.DataTable; import org.seasar.framework.unit.DataAccessor; import org.seasar.framework.unit.PreparationType; import org.seasar.framework.unit.Seasar2; import org.seasar.framework.unit.TestContext; import com.snail.exam.s2dao.CustomerBean; import com.snail.exam.s2dao.CustomerDao; @RunWith(Seasar2.class) public class CustomerDaoTest { // フィールド変数が、diconファイルで定義されたコンポーネントの場合 // S2Junit4によってインスタンス化される // テスト環境へのアクセス API を提供してくれるコンポーネント private TestContext ctx; // テスト対象のコンポーネント private CustomerDao dao; // Excel ファイルや Table へのアクセス API を提供してくれるコンポーネント private DataAccessor accessor; public CustomerDaoTest() { super(); } @Before public void before() { // ALL_REPLACEは、データベースの内容を全てExcelファイルで入れ替える // 他に、NONE、WRITE、REPLACE を指定できる。 // デフォルト値は、REPLACE(Excelに定義されたデータのみ上書き) ctx.setPreparationType(PreparationType.ALL_REPLACE); } @Test public void testFindByAddress() { // -- 0.テストの準備 // S2JUnit4 によって、"$テストクラス名_$テストメソッド名.xls" ファイルに記述されている // 内容をデータベスに格納する。 // (後ろにあるシートから処理されるようだ...FK制約があるときには親を後ろのシートに定義する) // -- 1.テスト対象の実行 List<CustomerBean> resultList = dao.findByAddress("メル%"); // -- 2.返値の検証 DataSet expected = ctx.getExpected(); // Listの比較をするときに、順番関係なくてよければ assertEqualsIngoreTableOrder()を使える // 期待値ブックに入れられるのは、1シートのみ assertEquals("OUTPUT", expected, resultList); // -- 3.副作用の検証 // テスト対象を実行後にデータベースがどうなっているべきかの検証 // (このテストでは、データベースへの書き込みはやっていませんが・・・) DataTable tbl = accessor.readDbByTable("CUSTOMER_TBL"); DataSet xls = accessor.readXls(ctx.getTestClassShortName() + "_" + ctx.getTestMethodName() + "_SIDE_EFFECTS" + ".xls"); assertEquals(xls.getTable("CUSTOMER_TBL"), tbl); // -- 4.テストの後処理 // 0〜3がロールバックされる(合格・不合格にかかわらず。例外が発生した場合でも) } }
$ cd /opt/local/java/db-derby-10.3.3.0/bin/ $ ./startNetworkServer DRDA_SecurityInstalled.I 2009-01-10 16:08:39.964 GMT Thread[main,5,main] java.io.FileNotFoundException: /opt/local/java/db-derby-10.3.3.0/bin/derby.log (Permission denied) Apache Derby Network Server - 2009-01-10 16:08:39.994 GMT に 10.3.3.0 - (652961) が開始され、ポート 1527 で接続を受け入れる準備ができました。 Apache Derby Network Server - 2009-01-10 16:08:39.994 GMT に 10.3.3.0 - (652961) が開始され、ポート 1527 で接続を受け入れる準備ができました。
停止したいときには、別の Terminal から
$ cd /opt/local/java/db-derby-10.3.3.0/bin/ $ ./stopNetworkServer
ファイル(env_ut.txt)がないため環境変数#Envに値(ut)が設定されました 設定ファイル(com/snail/exam/s2dao/test/CustomerDaoTest.dicon)をインクルードします トランザクションを開始しました。tx=[FormatId=4360, GlobalId=1231603435952/0, BranchId=] Excelファイル(com/snail/exam/s2dao/test/CustomerDaoTest_testFindByAddress.xls) の値でデータベースをすべて置き換えます 物理的なコネクションを取得しました DELETE FROM ORDER_TBL DELETE FROM CUSTOMER_TBL INSERT INTO CUSTOMER_TBL (NAME, ADDRESS) VALUES ('たびのどうぐや', 'メルキド') INSERT INTO CUSTOMER_TBL (NAME, ADDRESS) VALUES ('よろずや', 'メルトモ') INSERT INTO CUSTOMER_TBL (NAME, ADDRESS) VALUES ('さばくのきつね', 'ドムドーラ') SELECT CUSTOMER_TBL.ADDRESS, CUSTOMER_TBL.NAME, CUSTOMER_TBL.ID, CUSTOMER_TBL.CREDIT_FACILITY, CUSTOMER_TBL.DISCOUNT_RATE, CUSTOMER_TBL.ON_CREATE, CUSTOMER_TBL.ON_UPDATE FROM CUSTOMER_TBL WHERE ADDRESS LIKE 'メル%' Excelファイル(com/snail/exam/s2dao/test/CustomerDaoTest_testFindByAddress_Expected.xls) を期待値として読み込みます SELECT * FROM CUSTOMER_TBL ORDER BY id トランザクションをロールバックしました。tx=[FormatId=4360, GlobalId=1231603435952/0, BranchId=] 物理的なコネクションを閉じました