サンプルプロジェクトはこちら 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=] 物理的なコネクションを閉じました