如何创建每次调用方法时具有不同行为的 Rhino Mock

How to create a Rhino Mock that has different behavior each time a method is called

我正在尝试弄清楚如何使用 rhino mocks 创建一个 mock,它将在第一次调用特定方法 (BasicPublish) 时调用原始方法,第二次抛出异常,然后调用原始方法对该方法的所有剩余调用。

原始方法签名如下所示:

public virtual void BasicPublish(
    string exchange, string routingKey, IBasicProperties basicProperties, byte[] body)

这可能吗?

以下是我尝试过的我认为可行的方法。我的测试现在正在调用原始方法。但是在我的方法中设置断点并调试对 BasicPublish 的调用后,所有参数都作为 null 传递。我是否错误地使用了 "CallOriginalMethod(OriginalCallOptions.CreateExpectation)"?

        mockModel.Stub(a => a.BasicPublish(Arg<string>.Is.Anything, Arg<string>.Is.Anything, Arg<IBasicProperties>.Is.Anything, Arg<byte[]>.Is.Anything)).CallOriginalMethod(OriginalCallOptions.NoExpectation).Repeat.Once();
        mockModel.Stub(a => a.BasicPublish(Arg<string>.Is.Anything, Arg<string>.Is.Anything, Arg<IBasicProperties>.Is.Anything, Arg<byte[]>.Is.Anything)).Throw(new DivideByZeroException()).Repeat.Once();
        mockModel.Stub(a => a.BasicPublish(Arg<string>.Is.Anything, Arg<string>.Is.Anything, Arg<IBasicProperties>.Is.Anything, Arg<byte[]>.Is.Anything)).CallOriginalMethod(OriginalCallOptions.NoExpectation).Repeat.Any();

附加上下文:这将用于单元测试(使用 nunit)以测试自定义 Log4Net Rabbit MQ appender 的行为。测试用例如下:给定一个到队列的实时连接,当连接出现故障时(通过调用 BasicPublish(...) 的异常模拟),则忽略该特定日志消息并处理以下日志消息通常

我无法找到用 Rhino 执行此操作的方法,但我意识到我可以自己创建一个假的,它会按照我的预期运行。这个解决方案通过适当的命名约定变得非常可读。