クラスのモックも作れるMoqってステキ

単体テストでモックを使うときは、ほとんど Moq を利用するようになりました。

Moq のステキなところは、インタフェースだけじゃなく、クラスでもモックが作れること。テストのためだけにインタフェースを用意するのって、正直面倒ですよね。

ただし良いことばかりではありません。クラスのモックを作るためには、動作を指定したいメソッドを virtual にしておく必要があります。これに抵抗感がある人って、多いんじゃないでしょうか。「公開するクラスにはできるだけ virtual なメンバを持たせたくない」という気持はわかるので、モックを作りたいクラスには、ちょっとした対策を取っています。

public class Greeting
{
#if DEBUG
    virtual
#endif
    public string Greet(string name)
    {
        throw new NotImplementedException();
    }
}
[TestMethod]
public void GreetTest()
{
    // クラスのモックを作る
    // Debug ビルドのときは Greet メソッドが virtual なので上書き可能
    Mock<Greeting> mock = new Mock<Greeting>();
    mock.Setup(m => m.Greet("Seigo")).Returns("Hello, Seigo.");

    Assert.AreEquals("Hello, Seigo", mock.Object.Greet("Seigo"));
}

「Debug ビルドのときだけ virtual を付ける」という方法。Debug ビルドでしか単体テストができませんが、私の環境ではそれでも問題無いので。