単体テストでモックを使うときは、ほとんど Moq を利用するようになりました。
- Moq のススメ - present
- moq - The simplest mocking library for .NET and Silverlight - Google Project Hosting
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 ビルドでしか単体テストができませんが、私の環境ではそれでも問題無いので。