スタブとドライバとモックの違い

目次

スタブとドライバとモックの違いのまとめ

置き換える位置 目的 使用例
スタブ(Stub) 下位モジュール(呼び出される側) 上位モジュール(呼び出す側)をテストする

本来のBが未完成なので、Bの代わりに返り値だけ返す「仮のB」を作る

ドライバ(Driver) 上位モジュール(呼び出し元) 下位モジュール(呼ばれる側)をテストする

本来のAが未完成なので、Aの代わりにBを呼び出す「仮のA」を作る

モック(Mock) 下位モジュール(呼び出される側) スタブに「呼び出し検証」の機能を追加したもの

値+呼び出し回数・引数などを検証する

スタブは、呼ばれる側の代役です。

ドライバは、呼ぶ側の代役です。

以下のシステムがあるとき、

画面入力 → 計算プログラム → データベース

計算プログラムをテストしたい時で

データベースが未完成の場合は、データベースの代わりにスタブを使用します。

画面入力が未完成の場合は、画面入力の代わりにドライバを使用します。

スタブとは

  • テスト実行時に、呼び出し先が未完成等のときに代替として使用します。
  • 値を返します。
  • ダミー(本物に似ているが中身はないもの)です。
  • 対象のコードから見て、スタブは下位にあたります。
  • スタブ(stub)は、切り株という意味です。

コードとスタブのイメージ

以下は、テストする対象のサンプルイメージのコードです。(Javaです)

package test1;

public class Class1 {
	String getName(){
		Stub s1 = new Stub();
		return s1.getName() + "です"; // 赤です
	}
}

5行目は、インスタンスを生成しています。
6行目は、5行目のインスタンスのメソッドを呼び出しています。

スタブ

呼ばれる側のスタブのコードのイメージです。

package test1;

public class Stub {
	String getName(){
		return "赤";
	}
}

4行目は、値を返すメソッドです。

ドライバとは

  • テスト実行時に、呼び出し元が未完成等のときに代替として使用します。
  • ダミー(本物に似ているが中身はないもの)です。
  • 対象のコードから見て、ドライバは上位にあたります。
  • ドライバ(driver)は、運転手という意味です。
  • JUnitなどのツールを使用してコードを呼び出すイメージです。

コードとドライバのイメージ

以下は、テストする対象のサンプルイメージのコードです。(Javaです)

package test1;

public class Class1 {
	int plusOne(int a){
		return a + 1;
	}
}

このメソッドをドライバで呼び出します。

ドライバ

呼び出す側のドライバのコードのイメージです。

package test1;

public class Driver  {
	public static void main(String[] args) {
		Class1 c1 = new Class1();
		System.out.println(c1.plusOne(1)); // 2
		System.out.println(c1.plusOne(2)); // 3
		System.out.println(c1.plusOne(3)); // 4
 	}
}

5行目は、テストする対象のインスタンスを生成しています。
6行目以降は、5行目のインスタンスのメソッドを呼び出しています。

モックとは

モックは、スタブの機能に加え、テスト対象の呼び出し動作を検証します。

検証するのは、テスト対象と依存オブジェクトの間の相互作用です。

モックはテストコードの一部として、明確な「期待値(Expectation)」を定義します。

計算処理が完了した後に、ユーザにメールを送信するコードをテストする場合。実際にメールを送る代わりにメール送信モジュールをモック化します。

テスト後に、モックに対して「送信メソッドが、顧客のメールアドレスを引数に1回呼び出されたか」を検証します。

関連の記事

Java JUnit4の使い方とテストのサンプル
Java Mockitでテストするサンプル

△上に戻る