C#: Moqを使ったモック・スタブ作成方法

はじめに

基本的な使用方法

基本的なモック・スタブ

基本的なモック・スタブの作成方法を次に示します。

  • モック化するオブジェクトのインターフェイスを仮引数に指定してMockオブジェクトを生成します。
    Mock.Of<T>()を使用して、モック化対象オブジェクトを直接取得することもできます。
  • MockオブジェクトのSetup系メソッドでプロパティやメソッド呼び出しの条件を指定します。
    条件として任意の引数を指定する場合は、It.Any<型>()を指定します。
  • Returns系メソッドで戻り値を指定します。
  • 実行時にモックとして指定したプロパティやメソッドの引数と合致しない場合、戻り値の型に応じた既定値が返却されます。(int型なら0、string型ならnullなど)
  • テストで使用する実際のモック化されたオブジェクトは、MockオブジェクトのObjectプロパティから取得します。

引数に基づいた値を返却するスタブ

複数のSetupの定義やラムダ式を使用して、引数に基づいた値を返却できます。
次の例では、Measure1(), Measure2()ともに、引数に基づいて”matched”, “near”, “far”のいずれかを返却します。Measure1()は複数のSetup()で、Measure2()はラムダ式で、同一条件を定義しています。

例外をスローするスタブ

Throws()を使用して例外をスローできます。
モック対象が非同期処理の場合、ThrowsAsync()を使用しますが、各所でasync, awaitの指定が必要になります。(ThrowsAsync()の引数となるラムダ式にasync、各メソッドの呼び出しにawaitの宣言が必要になります。)

実行回数に基づいた値を返却するスタブ

SetupSequence()を使用することで、実行回数に基づいた値を返却できます。

プロパティのスタブ

SetupProperty()を使用すると、設定値を保持可能(追跡可能)なプロパティを実装できます。
個別の指定が面倒な場合、SetupAllProperties()で全てのプロパティのスタブを一括で作成できます。

読み取り専用プロパティ(getのみでsetプロパティアクセサーがないプロパティ)のスタブを作成する場合は、Setup()を使用します。
SetupGet()でも同様に実現できますが、このメソッドは後述のように検証目的のものです。混乱を避けるために、読み取り専用プロパティを実現する手段として使用しない方が良いと思います。

外部条件に基づいた値を返却するモック・スタブ

When()を使用すると、引数ではなくテストコード上で定義した条件でスタブの動作を変更できます。

void型のスタブメソッドとその検証

戻り値がないメソッドの場合、Verify()で実行有無や実行回数の検証ができます。

Callback()を使用することで、より複雑な検証を行うことができます。

メソッドが複数回実行された際の引数を検証する例を次に示します。
テストコード上で引数を格納するリストを宣言し、Callback()メソッドで実行時の引数をリストに追加しています。