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の単体テストを実行できます。