您可以在不使用 Rhino Mocks 实现虚拟实现类的情况下执行此操作:http ://www.ayende.com/wiki/Rhino+Mocks+Partial+Mocks.ashx
不幸的是,Rhino Mocks 要求您使用带有部分模拟的记录/播放语法而不是 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 就是您可以使用的模拟框架。