4

我在 RhinoMocks 中使用一个模拟对象来表示一个调用 MessageQueue.GetPublicQueues 的类。我想模拟消息队列在工作组模式下运行时抛出的异常,即MessageQueueException,以确保我正确捕获异常

MessageQueueException 没有公共构造函数,只有标准的受保护异常构造函数。有没有合适的方法从模拟对象/Expect.Call 语句中抛出这个异常?

4

2 回答 2

5

反射可以打破可访问性规则。您将使保修失效,.NET 更新很容易破坏您的代码。试试这个:

using System.Reflection;
using System.Messaging;
...
        Type t = typeof(MessageQueueException);
        ConstructorInfo ci = t.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, 
          null, new Type[] { typeof(int) }, null);
        MessageQueueException ex = (MessageQueueException)ci.Invoke(new object[] { 911 });
        throw ex;
于 2008-10-25T00:46:47.340 回答
3

您可以通过尝试创建无效队列来导致此问题。可能比被框架更改俘虏更安全(通过使用私有/受保护的构造函数):

MessageQueue mq = MessageQueue.Create("\\invalid");
于 2008-11-16T23:36:47.060 回答