2009年12月28日

Springによる単体テストの促進

なぜDIコンテナを使うのかの勉強メモです。

SpringをはじめとするDIフレームワークでは、他クラスへの依存はインターフェイスを介したものになります。インターフェイスを介するため、呼び出す側はそのインターフェイスを実装しているクラスの完成を待つ必要がなくなります。DIコンテナを利用すればDIコンテナが設定ファイルの記述に従ってインターフェイスの実装クラスをセットします。そのため、設定ファイルの内容を切り替えることで単体テスト用のモックオブジェクト(ダミーオブジェクト)に切り替えることができます。

サンプル

JuchuImplクラスはZaikoHikiateImplクラスに依存しています。
そのためJuchuImpl単体のテストを行おうとしても、
ZaikoHikiateImplクラスのhikiate()メソッドにバグがある場合テストができませんでした。

単体テストを行いにくいクラス

public class JuchuImpl implements Juchu {
    public void juchu(Integer syohinCode, Integer suryo) {
        ZaikoHikiate hikiate = new ZaikoHikiateImpl();
        hikiate.hikiate(syohinCode, suryo);
        // 受注を処理
    }
}

DIにより依存を低めたクラス

public class JuchuImpl implements Juchu {

    private ZaikoHikiate hikiate;

    public void setHikiate(ZaikoHikiate hikiate) {
        this.hikiate = hikiate;
    }
    public void juchu(Integer syohinCode, Integer suryo) {
        hikiate.hikiate(syohinCode, suryo);
        // 受注を処理
    }
}

JuchuクラスはZaikoHikiateImplクラスが完成していなくても
ZaikoHikiateインターフェイスを実装したモックオブジェクトを
DIコンテナにセットしてJuchuImplの単体テストを実行できます。

Share on Twitter Share the post
Qihuan Piao

朴 起煥

東京で働いている「外人歴」9年のソフトウェア「ライター」。いつの間にか納豆が食えるようになり、これで日本に慣れきったと思いきやまだまだ驚きが続いてる。読んだり書いたりするのが好きで、自身の経験や本から得た「何か」をここに書き出してる。最近古本屋にハマってる。

他にも英語中国語で書いてます、よろしければチェックしてみてください。