开发者

Rhino mock an abstract class w/o mocking its virtual method?

开发者 https://www.devze.com 2023-03-26 09:46 出处:网络
Can I execute the body of a virtual method that l开发者_JAVA技巧ives on an abstract class which has been mocked using Rhino Mocks?

Can I execute the body of a virtual method that l开发者_JAVA技巧ives on an abstract class which has been mocked using Rhino Mocks?

To be clear, I'm not trying to mock the behavior of the virtual method. I'm trying to /test/ the virtual method (on the mocked class).

Is this idea a blatant misuse of Rhino Mocks?


Yes, that should be absolutely fine. I can't say I've tried it, but I'd be very surprised if it failed.

EDIT: I suspect you want the PartialMock method. Here's an example:

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
    }
}

EDIT: Or in my first attempt at 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...
    }
}


You need to tell Rhino.Mocks to call back to the original implementation instead of doing its default behavior of just intercepting the call:

var mock = MockRepository.GenerateMock<YourClass>();
mock.Setup(m => m.Foo()).CallOriginalMethod(OriginalCallOptions.NoExpectation);

Now you can call the Foo() method on your mock object.

0

精彩评论

暂无评论...
验证码 换一张
取 消