如何使用Rhino在基类中模拟受保护的方法?

时间:2018-10-03 17:34:34

标签: c# rhino-mocks

internal abstract class ClassB: IInterface
{
    protected void Execute();
}

abstract class ClassA : ClassB
{
    public void methodToUT()
    {
        ---logic that I want to unit test----
        Execute();
    }
}

我想对methodToUT()进行单元测试。但是,由于Rhino是受保护的,因此我无法使用Rhino模拟/存根Execute()。我尝试创建 实现ClassB并覆盖Execute()的帮助程序类,以便我可以对其进行模拟。但是,我然后得到错误

“无效的呼叫,使用了最后一个呼叫或未进行任何呼叫(确保您正在调用虚拟(C#)/可重写(VB)方法)。”

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

单元测试有暴露设计问题的习惯。

如果该成员可以重构为virtualabstract

abstract class ClassB: IInterface {
    protected virtual void Execute();
}

,以便可以在派生类中覆盖它,然后

可以创建存根

public class StubClass: ClassA {
    protected override void Execute() {
        //...Do nothing
    }
}

否则,如果无法覆盖所需的成员,则可以用new关键字替换它。

public class StubClass: ClassA {
    protected new void Execute() {
        //...Do nothing
    }
}

出于测试目的

//Arrange
var subject = new StubClass(); 

//Act
subject.methodToUT();

//...