C# 如何使用.NET的MOQ模拟MQ系列对象MQQueueManager?

C# 如何使用.NET的MOQ模拟MQ系列对象MQQueueManager?,c#,.net,moq,ibm-mq,C#,.net,Moq,Ibm Mq,我正在尝试对我的项目的MQ Series实现进行单元测试,并且需要模拟到MQ Series服务器的连接,以测试我的实现,并避免从实际队列发送消息/检索消息 代码如下: using IBM.WMQ; using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; namespace Test { [TestClass] public class MQTest { [TestMethod]

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

代码如下:

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); 
        }
    }
}
使用IBM.WMQ;
使用Microsoft.VisualStudio.TestTools.UnitTesting;
使用最小起订量;
名称空间测试
{
[测试类]
公共类MQTest
{
[测试方法]
公共无效发送消息\u MoqUnitTest()
{
//创建模拟MQ管理器
var mqManMock=new Mock();
//通过调用send方法进行测试
MyMQhandler.MQSender MQSender=新的MyMQhandler.MQSender();
//尝试访问此处的moq对象时出错
mqsender.Send(“测试消息”,mqManMock.Object);
}
}
}
我知道我还没有在moq上进行任何设置,但是问题出现在实际运行任何代码之前

问题是,当我这样做时,我会得到一个异常。 来自内部异常的堆栈跟踪,消息为“发生I/O错误”:

在IBM.WMQ.MQChannelTable.createChannelEntryList(MQChannelListEntry名称列表)中 位于IBM.WMQ.Nmqi.ManagedNmqiMQ.createnamelistentryfromcdt(字符串qMgrName,字符串ccdtFile) 在IBM.WMQ.Nmqi.ManagedNmqiMQ.createnamelistentryfromcdt(字符串qMgrName) 位于IBM.WMQ.Nmqi.ManagedNmqiMQ.GetNameList(字符串qMgrName) 位于IBM.WMQ.Nmqi.ManagedNmqiMQ.DoConn(字符串qMgrName、MQConnectOptions cno、ManagedHconn manHconn、Int32&hConn、Int32&compCode、Int32&reason) 位于IBM.WMQ.Nmqi.ManagedNmqiMQ.MQCONNX(字符串pQMgrName、MQConnectOptions pConnectOpts、Phconn Phconn、Int32和pCompCode、Int32和pReason) 在IBM.WMQ.MQQueueManager.Connect(字符串queueManagerName) 在IBM.WMQ.MQQueueManager..ctor()上 在Castle.proxy.MQQueueManagerProxy..ctor(IInterceptor[])上

大多数时候我运行它,虽然我只是得到MQManMock.Object的“Function evaluation timed out”


这是否意味着我不能模拟MQ???

看起来您实际上是在点击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来验证send是否被调用,看起来您实际上正在访问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验证是否调用了send