C# 如何使用.NET的MOQ模拟MQ系列对象MQQueueManager?
我正在尝试对我的项目的MQ Series实现进行单元测试,并且需要模拟到MQ Series服务器的连接,以测试我的实现,并避免从实际队列发送消息/检索消息 代码如下: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]
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