モックオブジェクト(もっくおぶじぇくと)情報システム用語事典

mock object

» 2011年11月07日 00時00分 公開

 自動化されたユニットテスト(注1)において、テスト対象オブジェクトが呼び出し先のオブジェクトと意図したとおりに協調動作するかどうかを検証するために、呼び出し相手に換えて使用するテスト用のオブジェクトのこと。

 オブジェクト指向(注2)に基づいて作られたソフトウェアは、オブジェクト同士が相互作用を持つ。また、ビジネスアプリケーションの場合、外部データベースやWebサービスへのアクセスを行うことも多い。このようなソフトウェアをテストするとき、依存関係にある相手が未実装だったり、テスト環境からは接続不可だったりすると、システムが実行できないため、テストも不可となる。

 こうしたとき、いかにも本来の連携相手であるかのように振る舞う仮のオブジェクトを使ってテストを行う方法がある。このときに使われる疑似的な仮実装を「モックオブジェクト」という。

 モックオブジェクトはテスト対象がコード内部で使用している呼び出し先と同じインターフェイスを持ち外からは正しく動くように見えるが、内部ロジックは実装されておらず引数の検証とテストに必要な最低限の出力のみを行う。モックオブジェクトが未実装のクラスの振る舞いをまねることで、それに依存するクラス(開発中のクラス)の振る舞いを検証することができる。

 モックオブジェクトはテスト駆動開発におけるテクニックとして提唱された。テスト駆動開発におけるテストの基本はメソッドの振る舞いを設計・検証することだが、詳細設計(構造)だけではなく外部設計(機能)も考慮すれば、オブジェクトの振る舞いも定義・評価する必要がある。

 モックオブジェクトを定義する作業は、実装中のオブジェクトが参照しているオブジェクトやメソッドの機能設計を行うことと事実上同義である。この設計はオブジェクトが相互にどのようなやり取りを行っているか、という観点で行われる。この点でモックオブジェクトは、機能や振る舞いを中心に概要設計を行い、内部設計や実装は時間を掛けてリファクタリングするというテスト駆動開発を補完するものである。

 今日、ほとんどの言語にモックオブジェクトのフレームワークがあり、広く利用されている。これらのフレームワークでは、エクスペクテーション(期待される呼び出され方と、そのときの挙動)を設定することでモックオブジェクトの振る舞いを定義し、テスト対象オブジェクトからの呼び出しを記録して、エクスペクテーションどおりに呼び出されているかを検証する機能を提供する。

参考文献

▼『Endo-Testing: Unit Testing with Mock Objects』 Tim Mackinnon、Steve Freeman、Philip Craig=著/2001年5月[PDFPDF

▼『JUnit イン・アクション』 ビンセント・マソル、テッド・ハスティード=著/クイープ=訳/ソフトバンクパブリッシング/2004年5月(『JUnit in Action』の邦訳)

▼『Webアプリケーションテスト手法――テストの基礎と主要開発環境における実践メソッド』 水野貴明、石井勇一、新藤愛大、岸田健一郎、荻野淳也、安井力、田中慎司=著/毎日コミュニケーションズ/2008年8月


Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ