djUnitすげえ。

djUnit、モックメソッドの登録もできて本当に凄い!!忘れないように書いておく!!


例えば通信機能が実装されているアプリの場合、テストケースは、

的な、3種類のレスポンスが考えられる。
仮に、通信メソッドが例えば「IConnection.sendData(IToInformation info, ISendData sendData, ICallBack callback)」的な定義だったとしよう。IConnectionが通信をするインタフェース、IToInformationが通信先情報を持っているインタフェース、ISendDataが実際に送信されるデータインタフェース、ICallBackが送信処理後の上述3種のコールバックメソッドを持っているインタフェースとすると、ICallBackを次のように定義できる。(他のクラスはまぁコード書かなくてもいいよね。)

public interface ICallBack {
    /**
     * 通信成功
     * receiveData 受信データ
     */
    public void received(IReceiveData receiveData);
    /**
     * 通信失敗
     * code エラーの詳細情報とか?
     */
    public void sendError(IErrorCode code);
    /**
     * タイムアウト
     */
    public void timeOut();
}

テストケースクラスは、DJUnitTestCaseをextendsする。

public SampleTest extends DJUnitTestCase {
    /**
     * サンプルテスト1(通信成功パターン)
     */
    public void testSample1() {
        // 前準備
        IData data = createDummyISendData(); // 送信データを生成
        IToInformation to = createDummyIToInformation(); // 送信先データを生成
        ICallBack callback = createICallBack(); // コールバックオブジェクトを生成

        // ------------------------------
        // !!ここが肝!!
        // DJUnitTestCase.setReturnValueメソッドを使って、
        // 「IConnection.sendData()」のモックメソッドを作っておき、
        // 本物の「IConnection.sendData()」がコールされないようにできる!
        // ------------------------------
        setReturnValue(IConnection.class, "sendData");

        // 通信メソッドをコールする。
        // が、一行前のコードにより、本物のメソッドは呼ばれず、
        // 何事も無かったかのように次のコードへ進む。
        IConnection.sendData(to, data, callback);

        // 擬似レスポンスの為に、本テストケースで期待する受信データを生成しておき、
        // callbackのreceiveメソッドをコールする!
        IReceiveData receiveData = createDummyIReceiveData(); // ダミーの受信データを生成
        callback.receive(receiveData); // 擬似レスポンスをテストケース側からコールしてやる!

        // 通信成功時の状況をテストするコードをこの後ろに記述していく。
    }
    /**
     * サンプルテスト2(通信失敗パターン)
     */
    public void testSample2() {
        // 前準備
        IData data = createDummyISendData(); // 送信データを生成
        IToInformation to = createDummyIToInformation(); // 送信先データを生成
        ICallBack callback = createICallBack(); // コールバックオブジェクトを生成

        // モックメソッドを指定
        setReturnValue(IConnection.class, "sendData");

        // モック通信メソッドをコール
        IConnection.sendData(to, data, callback);

        // 擬似レスポンスの為に、本テストケースで期待するエラーコードを生成しておき、
        // callbackのsendErrorメソッドをコール。
        IErrorCode code = createDummyIErrorCode(); // ダミーのエラーコードを生成。
        callback.sendError(code); // 擬似レスポンスをテストケース側からコールしてやる。

        // 通信失敗時の状況をテストするコードをこの後ろに記述していく。
    }
    /**
     * サンプルテスト2(通信失敗パターン)
     */
    public void testSample2() {
        // 前準備
        IData data = createDummyISendData(); // 送信データを生成
        IToInformation to = createDummyIToInformation(); // 送信先データを生成
        ICallBack callback = createICallBack(); // コールバックオブジェクトを生成

        // モックメソッドを指定
        setReturnValue(IConnection.class, "sendData");

        // モック通信メソッドをコール
        IConnection.sendData(to, data, callback);

        // callbackのtimeOutメソッドをコール。
        callback.timeOut(); // 擬似レスポンスをテストケース側からコールしてやる。

        // タイムアウト時の状況をテストするコードをこの後ろに記述していく。
    }
}


こんな感じで、面倒な通信部分のテストを恙なく定義できてしまう。。
なんて素晴らしいんだろうか。。


POSシステムを・・・Swingで作って、テストをJUnitdjUnit&Fest-Swingで作れないか?
Schemeやりたいけど・・・こっちも思考実験としておもしろいなぁ。。)