Rhino Mocks を使用してダミーの実装クラスを実装せずにこれを行うことができます: http://www.ayende.com/wiki/Rhino+Mocks+Partial+Mocks.ashx
残念ながら、Rhino モックでは、AAA 構文ではなく、部分モックで記録/再生構文を使用する必要があります。
次の抽象クラスがあるとします。
public abstract class BaseAbstract
{
public abstract int Increment();
}
public abstract class AbstractClass<T> where T : BaseAbstract
{
private int inc;
public abstract T Abstract();
public virtual int Concrete()
{
return inc += Abstract().Increment();
}
}
次の方法で Concrete の実装をテストできます。
[Test]
public void mock_an_abstract_class_with_generic()
{
var mocks = new MockRepository();
var baseAbstract = mocks.StrictMock<BaseAbstract>();
var abstractClass = mocks.PartialMock<AbstractClass<BaseAbstract>>();
using (mocks.Record())
{
baseAbstract.Stub(a => a.Increment()).Return(5);
abstractClass.Stub(a => a.Abstract()).Return(baseAbstract);
}
using (mocks.Playback())
{
abstractClass.Concrete().ShouldEqual(5);
abstractClass.Concrete().ShouldEqual(10);
}
}
基本的には、基本クラスの部分モックを作成し、抽象メソッドに期待値を設定してから、テスト対象の具象メソッドを呼び出します。ジェネリックは単に別のモックであり、必要に応じて別の部分です。
これの欠点は、明らかに記録/再生構文の要件です。他のモッキング フレームワークがここでさらに役立つかどうかはわかりませんが、このような高度なユース ケースがある場合は、一般的に Rhino Mocks がモッキング フレームワークであることがわかりました。