サンプルプロジェクトはこちら fileS2JUnit4Exam.zip
(ビルドや実行には Eclipse + m2plugin が必要です)

はじめに

S2Junit4 を使うために S2/S2DAO の他に必要なもの

pom.xml (依存ライブラリの追加)

jdbc.dicon (DB接続の変更)

テストのための資産とその内容

s2junit4.png

テスト対象

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-TigerSeasar S2Tiger の続きでサンプルコードをいじっている人は要注意

diconファイル

テストデータ

テストクラス

テストメソッドの命名規約や起動順序の詳細については、下のサンプルに目を通してから、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がロールバックされる(合格・不合格にかかわらず。例外が発生した場合でも)
  }
}

Derbyの起動

$ 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

実行結果


Java#Seasar2


添付ファイル: fileexpect.png 1149件 [詳細] files2junit4result.png 1129件 [詳細] files2junit4.png 1589件 [詳細] filedbInit1.png 1222件 [詳細] filesideEffect.png 1236件 [詳細] filedbInit2.png 1205件 [詳細] fileS2JUnit4Exam.zip 1507件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS   sitemap
Last-modified: 2009-01-11 (日) 01:35:06 (2883d)
ISBN10
ISBN13
9784061426061