如何使用MOQ for .NET模拟MQ-Series对象MQQueueManager?

时间:2010-12-01 10:17:47

标签: c# .net moq ibm-mq

我正在尝试对我的项目的MQ系列实现进行单元测试,并且需要模拟与MQ系列服务器的连接以测试我的实现隔离并避免从实际队列发送消息/检索消息。

以下是代码:

using IBM.WMQ;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;

namespace Test
{
    [TestClass]
    public class MQTest
    {
        [TestMethod]
        public void SendMessage_MoqUnitTest()
        {
            //create a mock MQ manager
            var mqManMock = new Mock<MQQueueManager>();

            //test by calling the send method
            MyMQhandler.MQSender mqsender = new MyMQhandler.MQSender();
            //error happens when trying to access the moq object here
            mqsender.Send("test message", mqManMock.Object); 
        }
    }
}

我知道我还没有在moq上进行任何设置,但问题出现在任何代码实际运行之前。

问题在于,当我这样做时,我得到一个例外。 从内部异常堆栈跟踪消息“发生I / O错误”:

IBM.WMQ.MQChannelTable.CreateChannelEntryLists(MQChannelListEntry nameList)中的

   at IBM.WMQ.Nmqi.ManagedNmqiMQ.CreateNameListEntryFromCCDT(String qMgrName,String ccdtFile)    at IBM.WMQ.Nmqi.ManagedNmqiMQ.CreateNameListEntryFromCCDT(String qMgrName)    在IBM.WMQ.Nmqi.ManagedNmqiMQ.GetNameList(String qMgrName)    at IBM.WMQ.Nmqi.ManagedNmqiMQ.DoConn(String qMgrName,MQConnectOptions cno,ManagedHconn manHconn,Int32&amp; hConn,Int32&amp; compCode,Int32&amp; reason)    at IBM.WMQ.Nmqi.ManagedNmqiMQ.MQCONNX(String pQMgrName,MQConnectOptions pConnectOpts,Phconn phconn,Int32&amp; pCompCode,Int32&amp; pReason)    at IBM.WMQ.MQQueueManager.Connect(String queueManagerName)    在IBM.WMQ.MQQueueManager..ctor()    在Castle.Proxies.MQQueueManagerProxy..ctor(IInterceptor [])

大多数时候我运行它虽然我只是得到了“函数评估超时”和MQManMock.Object。

这是否意味着我无法模拟MQ ??

1 个答案:

答案 0 :(得分:1)

看起来你实际上正在点击MQQueueManager。

你需要做什么把MQQueueManager放在你自己的接口后面(假设类本身还没有实现接口)并使用Mock来构建那个接口。

所以使用send方法创建一个IMQQueueManager,并且在您的实现中实际上使用MQQueueManager来处理您的消费类,然后通常通过构造函数将这个接口传递给它们,以便使用MQQueueManager。

所以你可以写一个这样的实现

public interface IMQQueueManager 
{
    void Send(string message, MQManMock obj);
}

public interface ConcreteMQQueueManager : IMQQueueManager
{
    public void Send(string message, MQManMock obj)
    {
        //create a mock MQ manager
            var MQManMock = new MQQueueManager();

            //test by calling the send method
            MyMQhandler.MQSender mqsender = new MyMQhandler.MQSender();
            //error happens when trying to access the moq object here
            mqsender.Send("test message", MQManMock.Object); 
    }
}

那么你将针对下面的课程编写单元测试

public class myclass
{

    IMQQueueManager _manager
    public myclass(IMQQueueManager queueManager)
    {
        _manager = queueManager;
    }

    public void AddItemToQueue(string MyItem)
    {

        _manager.Send("Hello",MQManMock.Object);
    }

}

使用Moq验证发送是否被调用