djUnitすげえ。
djUnit、モックメソッドの登録もできて本当に凄い!!忘れないように書いておく!!
例えば通信機能が実装されているアプリの場合、テストケースは、
- 通信成功
- 通信失敗
- タイムアウト
仮に、通信メソッドが例えば「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で作って、テストをJUnit&djUnit&Fest-Swingで作れないか?
(Schemeやりたいけど・・・こっちも思考実験としておもしろいなぁ。。)