今日からぼちぼちと、最近人気があるMockライブラリの「Moq」について、学習しながら紹介していこうと思います。
 初回は、Moqとは何か?Mockとは何か?そして、Moqを使ったMockオブジェクトの作成方法について紹介します。
  
 なお、このエントリはC# Advent Calendar jp: 2010 : ATNDへの参加エントリでもありますので、興味のある方はそちらもどうぞ。
  
 Moqとは?
 .NETで使える「Mockオブジェクト」を扱うオープンソース・ライブラリです。~qの名前の通り、Linqのようにメソッドチェーンとラムダ式を使って、Mockオブジェクトの操作が行えることが特徴です。
 公式サイト:moq - Project Hosting on Google Code
  
 Mockオブジェクトとは?
 まずは”mock”を英和辞典で引いてみましょう。
 “mock”の検索結果(157 件):英辞郎 on the Web:スペースアルク
  【名】  
 - 嘲り、冷笑  
 - 模造品、まがい物
 
 つまり、Mockオブジェクトとは本来のオブジェクトの「模造品」で、元となるオブジェクトと同じ「インターフェース」(C#のinterfaceではなく、広い意味でのインターフェース)を持ち、その振る舞いを偽装するオブジェクトのことを言います。
  
 Mockオブジェクトの使い道
 Mockオブジェクトは、次のような用途で使います。
  - いわゆる「部品」が完成するまでの代用品として使用する。  
 - MSTest、JUnitなどでUnitTestを行う際、テスト対象クラスの中でデータベースなど外部に依存するオブジェクトを差し替え、対象クラス単体でのテストを可能にする。
 
  
 1.部品の代用品
 アプリケーション開発を進めていくうえで、「部品」というものはどうしてもその作成が遅れがちなものです。
 そんなとき、部品のインターフェースだけ決めておけば、あとはMockオブジェクトで部品の動作を偽装して、アプリケーションのプログラミングを続行できます。
 プログラム作成者は、部品が完成したらMockオブジェクトを本物に差し替えるだけでよくなります。
  
 ・Mockなし
 
 ・Mockオブジェクト使用
 
  
 2.UnitTestでの依存オブジェクト差し替え
 データベースアクセスやネットワークアクセス、サードパーティ製のモジュール呼び出しなど、外部に「依存」したクラスをテストする際、動作環境がそろっていないとUnitTestが行えなかったり、行えても時間がかかってしまったりします。
 そんな時は、外部に依存する部分をインターフェースに切りだし、切り出したインターフェースをもとにMockオブジェクトを作成することで、外部への「依存」を断ち切り、純粋にテスト対象クラスのみのUnitTestが行えるようになります。
  
 ・Mockなし
 
 ・Mockオブジェクト使用
 
  
 Moqを使ったMockオブジェクトの作成
  事前準備
 まずは、Moqの公式サイトからMoqをダウンロードします。
 Downloads - moq - Project Hosting on Google Code
 (今回はMoq.4.0.10827を使います。)
 
  
 ダウンロードしたファイルを解凍してできたMoq.dllを、VSのプロジェクトで参照します。
 
  
 そして、プロジェクトのターゲットフレームワークが、「.NET Framework 4 Client Profile」ではなく「.NET Framework 4」であることを確認します。
 
  
 最後に、C#ならusing、VBならImportsを使って、Moq名前空間をコードに追加します。
 
  
 Mockオブジェクトの作成
 Mockオブジェクトを作成するには、Moq.Mockクラスのコンストラクタを使い、次のようなコードを書きます。
 // Mockの作成
var mock = new Mock<IList>();
// 作成したMockオブジェクトの取得
var list = mock.Object;
 
まず、Mockコンストラクタの型引数に、Mockを作成したいinterfaceやclassを指定して、Mockクラスのインスタンスを生成します。
そして、Mock.Objectプロパティで、型式数で指定したinterfaceやclassのMockオブジェクトを取得します。
 
Mockの使用
作成したMockオブジェクトは、通常のオブジェクトを同じように使えます。
Console.WriteLine(list.Count);
 

 
まとめ
- MoqとはオープンソースのMockingライブラリ。 
- Mockとはオブジェクトの模造品で、元オブジェクトの振る舞いを偽装することができる。 
 - Mockを使うことで、部品と部品を使用するプログラムの並行開発や、依存を排除したUnitTestの実行等が可能となる。
 
 - Moqでのオブジェクト作成はMock<T>コンストラクタで行う。 
- Mockオブジェクト取得はMock.Objectプロパティを使う。
 
 - Moqで作成したMockオブジェクトは、通常のオブジェクトと同じように使える。
 
 
次回以降の予定
具体的なMoqの使い方を順に学習し、紹介していこうと思います。