如何在不mock虚拟方法的情况下,对Rhino Mock中的抽象类进行mock处理?

7

我能否执行在使用Rhino Mocks进行mock的抽象类上存在的虚方法的主体?

明确一点,我不是在尝试mock虚方法的行为。我在试图测试(被mock的类上的)虚方法。

这个想法是否是对Rhino Mocks的明显误用?

2个回答

11

没问题,完全可以这样做。虽然我没有尝试过,但如果失败了,我会非常惊讶。

编辑:我猜你想要使用PartialMock方法。这里是一个例子:

using System;
using Rhino.Mocks;

public abstract class Abstract
{
    public virtual int Foo()
    {
        return Bar() * 2;
    }

    public abstract int Bar();        
}

class Test
{
    static void Main(string[] args)
    {
        MockRepository repository = new MockRepository();
        Abstract mock = repository.PartialMock<Abstract>();

        using (repository.Record())
        {
            Expect.Call(mock.Bar()).Return(5);
        }

        Console.WriteLine(mock.Foo()); // Prints 10
    }
}

编辑:或者在我第一次尝试AAA时:

using System;
using Rhino.Mocks;

public abstract class Abstract
{
    public virtual int Foo()
    {
        return Bar() * 2;
    }

    public abstract int Bar();        
}

class Test
{
    static void Main(string[] args)
    {
        // Arrange
        Abstract mock = MockRepository.GeneratePartialMock<Abstract>();
        mock.Stub(action => action.Bar()).Return(5);

        // Act
        int result = mock.Foo();

        // Assert
        mock.AssertWasCalled(x => x.Bar());
        // And assert that result is 10...
    }
}

我在问题中应该更清楚。我已经尝试了简单的方法,但它不起作用。我希望有人能够解释一下如何测试一个虚拟方法,该方法存在于使用Rhino Mocks实例化的抽象类上。 - lance
@lance:是的,如果你一开始就说了那个会很有用...我会尝试重现这个问题。 - Jon Skeet
我正在使用Rhino Mock的AAA语法,但它对我来说失败了。您能否使用AAA语法进行成功的复制? - lance
@lance: 我自己没有使用过AAA风格,但是看起来它应该是可以的,如果你对被调用的虚拟方法调用的任何抽象方法的存根行为感到满意。听起来你比我更有AAA方法的经验,所以你可能更适合进行实验。 - Jon Skeet
@lance:我已经拼凑出了我认为 AAA 语法应该是什么样子的一部分内容,但可能并不完美... - Jon Skeet
显示剩余4条评论

1
你需要告诉Rhino.Mocks回调原始实现,而不是默认拦截调用的行为:
var mock = MockRepository.GenerateMock<YourClass>();
mock.Setup(m => m.Foo()).CallOriginalMethod(OriginalCallOptions.NoExpectation);

现在你可以在你的mock对象上调用Foo()方法。

生成静态模拟时,我看不到Setup方法? - lance
嗯...你使用的Rhino.Mocks版本是哪个? - PatrickSteele

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接