今日からぼちぼちと、最近人気がある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の使い方を順に学習し、紹介していこうと思います。