S2JUnit4のステータス

S2JUnit4ですが、ある程度つくりました。ほぼ仕様(id:makotan:20060527#p3)どおりです。
org.junit.internal.runnersパッケージのクラス(TestMethodRunnerとかTestIntrospectorとか)をある程度拡張したかったのですが、privateやpackage privateの壁に阻まれてうまくいきませんでした。結果として似たようなクラスが別個に出来上がってしまったのがちょっと残念な感じです。まあ仕方がないですよね...。

S2本体のexamples.unitのサンプルと同等のものをS2JUnit4で作るとこんなかんじになります。

import static org.seasar.junit4.S2Assert.assertEquals;

@RunWith(Seasar2.class)
public class EmployeeDaoImplTest {

    private EmployeeDao dao_;

    private DataAccessor da;

    public void getEmployee() throws Exception {
        Employee emp = dao_.getEmployee(9900);
        DataSet expected = da
                .readXls("EmployeeDaoImplTest_getEmployee_Expected.xls");
        assertEquals("1", expected, emp);
    }
}

JUnit4の特徴ではなくS2Unitとの違いで特徴を挙げると次の3つでしょうか。

処理の流れはこうなります。

  1. javaee5.diconまたはj2ee.diconが存在すれば自動でincludeする
  2. クラス名.diconが存在すれば自動でincludeする
  3. フィールドバインディングを行う
  4. トランザクションを開始する
  5. クラス名_メソッド名_.xlsが存在すれば読み込んでDBに書き込む
  6. テストメソッド(public、非static、引数無し、戻り値無しのメソッド)を実行する
  7. トランザクションロールバックする

その他特徴

  • 最も重要なのは@RunWith(Seasar2.class)をつけること。
  • S2専用のassertメソッドはS2Assertをstatic importして使う。
  • DataAccessorはExcelとDBを読み書きするメソッドを束ねたクラス。DataAccessorは宣言すれば自動でバインディングされる。
  • 自動でロールバックという挙動を変更したい場合は、TxBehaviorアノテーションをクラスまたはメソッドに付ける。
    • @TxBehavior(TxBehaviorType.COMMIT) : コミットしたいとき
    • @TxBehavior(TxBehaviorType.NONE) : トランザクション無しで実行したいとき
    • @TxBehavior(TxBehaviorType.ROLLBACK)というタイプもあります
  • @Testや@Ignoreは有効
  • @BeforeClass、@AfterClass、@Before、@Afterも有効
  • beforeXxx、afterXxx、というメソッドを用意すれば各メソッドごとに事前処理、事後処理ができる(設定ファイルを使えば無効にしたり命名規則を変更したりすることが可能。)
  • diconを使ってSeasar2クラスやその他のクラスの挙動を変更できる。
    • デフォルトではpublic、非static、引数無し、戻り値無しのメソッドをテストメソッドとみなしますが、@Testがついたものだけをテストメソッドとしたいとか、独自のアノテーションで挙動を変更したいとか、コードとdiconを少し書けば実現できます。でも、このあたり、JavaEE勉強会ででた話題とイメージが違うかも。コンポジットがどうのこうのという話がありましたよね...、どんな話か失念しました。


これから(といってもすぐにというわけではないですけど)、やりたいなぁと思っていることは

  • id:makotan:20060528#p2の内容
  • JUnit 4 Extensions のコードが外からうまく呼び出せないので @Prerequisiteと同等の機能はいっそS2JUnit4に取り込んじゃう
  • EJB 3.0 とか JPA への対応を考えてみる