RhinoMock - 为同一个 class 模拟多个存根

RhinoMock - mocking multiple stubs for the same class

假设我有一个 class 从我正在测试的 MainClass 方法中调用。

public class MainClass
{
    private readonly SubClass;
    // constructor not shown
    public method TestMethod()
    {
        var data = SubClass.MethodA();

        // ...some code

        var moreData = SubClass.MethodB(someOtherData);

        // ...more code
    }
}

使用 RhinoMock,我想为 SubClass.MethodA() 创建一个存根到 return 测试中指定的一组数据,但是在调用 SubClass.MethodB() 时,我想调用原始实现。

我不想将 SubClass' 两种方法分解成它们自己的 classes,因为它们适合 SubClass。在 RhinoMock 中有没有办法在同一个 class(不是存根)中调用另一个方法的同时存根一个方法?

我会为此使用提取和覆盖测试模式以及一个简单的存根。 虽然这并没有明确使用 Rhino,但可以满足您的情况。

如果您不想走这条路,请考虑通过构造函数、public setter 或参数将 Subclass 注入 MainClass,然后您可以拥有更多控制权首先模拟子class。

我们的想法是制作一个虚拟方法,子 class 存根可以覆盖它以控制被测 class 的一部分的行为。

public class MainClass
{
    private readonly SubClass _subClass;

    // constructor not shown
    public void TestMethod()
    {
        var data = SubClassMethodACall();

        // ...some code

        var someOtherData = "";
        var moreData = _subClass.MethodB(someOtherData);

        // ...more code
    }

    protected virtual string SubClassMethodACall()
    {
        return _subClass.MethodA();
    }
}

public class SubClass
{

    public string MethodA()
    {
        return null;
    }

    public string MethodB(string s)
    {
        return null;
    }
}

namespace Tests.Unit
{
    public class MainClassStub : MainClass
    {
        private readonly string _returnValueForMethodA;

        public MainClassStub(string returnValueForMethodA)
        {
            _returnValueForMethodA = returnValueForMethodA;
        }

        protected override string SubClassMethodACall()
        {
            return _returnValueForMethodA;
        }
    }

    [TestFixture]
    public class TestClass
    {
        [Test]
        public void TestMethod()
        {
            var mainClass = new MainClassStub("this is the test value returned");
            //.. rest of test
        }
    }
}