NMock 2.0

知らないうちに2.0になっていた。

NMock

最新版をダウンロードして少し使ってみたが、「NMock 2.0 is inspired by the newer jMock library.」とあるように、エクスペクテーション等のメソッドがjMockと似通った使い勝手となった感じだ。
私のように、Java側と.NET側とのテスト・インフラストラクチャをできるだけ合わせたいと思っている開発者にとっては非常に有り難い。

とはいうものの、jMockと全く同じという訳には行かないようだ。例えば以下のようにIHogeインタフェースの振る舞いを記述するモックに対して、順序の制約やパラメタの制約を与えるケースだが、jMockの場合、

Mock hogeMock = mock(IHoge.class, "hogeMock ");
hogeMock.expects(once()).method("method1").will(returnValue(0));
hogeMock.expects(once()).method("method2").with(eq("1")).after(hogeMock , "method1").isVoid();
//
アサートする処理

などと書くのだが、NMock2.0では同様の記述は無いので、代わりにMock::Orderedプロパティ(IDisposableを実装している)を使用して、順序を以下のようにコーディングする。なお、パラメタ制約に関しては、Isクラスを使用する。

Mockery mock = new Mockery();
IHoge hoge = mock.NewMock();
using(mock.Orderd)
{
    Expect.Once.On(hoge).Method("method1").WithNoArguments().Will(Return.Value(0));
    Expect.Once.On(hoge).Method("method2").With(Is.EqualTo("1")) ;
    //
    アサートする処理
}
mock.VerifyAllExpectationsHaveBeenMet();

jMockより明解で自己記述的だが、jMockに慣れていると却って戸惑う。

追記

NMockにおいて、順序制約を使うとその後のエクスペクテーションがチェックされないケースがあることに気が付いた。処理を故意にRed条件にして、ExpectationExceptionがスローされる状態でusing(mock.Orderd)で括ると、今度はExpectationExceptionがスローされなくなるのだ。何か使い方を間違ってるぽい?。