【问题标题】:How to mock a protected method in base class using Rhino?如何使用 Rhino 在基类中模拟受保护的方法?
【发布时间】:2018-10-03 17:34:33
【问题描述】:
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 模拟/存根 Execute(),因为它是受保护的。我尝试创建 一个实现 ClassB 并覆盖 Execute() 的辅助类,以便我可以模拟它。但是,然后我得到错误 “无效调用,已使用最后一次调用或未进行任何调用(确保您正在调用虚拟 (C#) / 可覆盖 (VB) 方法)。”

任何帮助将不胜感激。

【问题讨论】:

  • 单元测试有暴露设计问题的习惯。这种方法有什么作用?是否可以将其重构为virtual,以便在派生类中对其进行覆盖?

标签: c# rhino-mocks


【解决方案1】:

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

如果该成员可以重构为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();

//...

【讨论】:

  • 恐怕我做不到。我正在使用我无法修改的库中的 ClassB。
  • @PradeepVairamani 你能重构你的代码以使用适配器模式吗?这样你就不会与你无法控制的代码紧密耦合?
  • 我不完全确定如何做到这一点。 StubClass 等效项正是我所做的,但随后出现错误“”无效调用,已使用最后一次调用或未进行调用(确保您正在调用虚拟(C#)/可覆盖(VB)方法) .""
  • @PradeepVairamani 通过手动创建存根不需要 RhinoMocks。您创建一个被测主题的实例并进行测试。
  • 使用 new 关键字创建主题实例的问题是基本方法被隐藏但没有被覆盖。因此它仍然尝试调用基类的 Execute()。
猜你喜欢
  • 1970-01-01
  • 2016-03-09
  • 2016-05-29
  • 1970-01-01
  • 2012-01-08
  • 1970-01-01
  • 2017-05-05
  • 1970-01-01
相关资源
最近更新 更多