Rhino Mocks

これはなかなかいいな。
NMock2.0からの移行は、以下の手順で行った。

  1. NMock2.0で書いたテストをRhino Mocksでも作成(別ファイルに作成)
  2. どちらのテストもすべて成功することを確認
  3. NMock2.0のテストを削除


NMock2.0よりも優れている点としては、

  • Rhino Mocksは文字列による設定じゃないから、名前を気軽に変更できる
  • 設定中に実際にメソッドを呼び出しているため、シグニチャを変更してもコンパイル時に検出可能
  • NMock2.0では横に広がりすぎるため、改行していた部分を改行なしで書けたり、改行の回数を減らせる

逆に、劣っている部分としては、

  • なぜかCallメソッド呼出し後にIntelliSenseがきかない
  • 戻り値の型がvoidのメソッドのテストは次のうち二択
    1. 面倒だが他の方法と同じ方法*1
    2. 手軽だが他の方法とは全く異なった方法*2
  • 回数を制限する方法が少し貧弱

くらい。
Callメソッド以降にIntelliSenseがきかないのは残念だけど、重要なのはCallメソッドの引数部分なのでこの部分でIntelliSenseがきくのはNMock2.0に対する大きなアドバンテージかな。
あと、ほとんどの場合で記述量がNMock2.0より少ないと言うのもかなりいい感じ。
例えば、

// NMock2.0
Expect.Once.On(hoge).Method("Hoge").WithNoArguments().Will(Return.Value(10));

こう書いていたのが、

// Rhino Mocks
Expect.Call(hoge.Hoge()).Return(10);

こう書ける。
これからはRhino Mocksを使っていくか。

*1:無名デリゲートでラップする。Expect.Call(delegate { hoge.Hoge(); }).Repeat.Times(2);

*2:普通にメソッド呼び出しを単体で記述し、LastCallクラスを使用していろいろ設定する。hoge.Hoge(); LastCall.Repeat.Times(2);