如何使用MOQ for .NET模拟MQ系列对象MQQueueManager?
我想单元测试我的项目的MQ系列实现,并且需要模拟到MQ系列服务器的连接以测试我的实现是否隔离,并避免发送消息/从实际队列中检索消息。如何使用MOQ for .NET模拟MQ系列对象MQQueueManager?
下面是代码:
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名称列表) 在IBM.WMQ.Nmqi.ManagedNmqiMQ.CreateNameListEntryFromCCDT(字符串qMgrName,字符串ccdtFile) 在IBM.WMQ.Nmqi.ManagedNmqiMQ.CreateNameListEntryFromCCDT(字符串qMgrName) 在IBM.WMQ.Nmqi.ManagedNmqiMQ.GetNameList(字符串qMgrName) 在IBM.WMQ.Nmqi.ManagedNmqiMQ.DoConn(字符串qMgrName,MQConnectOptions CNO, ManagedHconn manHconn,Int32 & hConn,Int32 & compCode,Int32 & reason) at IBM.WMQ.Nmqi.ManagedNmqiMQ.MQCONNX(St环pQMgrName,MQConnectOptions pConnectOpts,Phconn phconn,的Int32 & pCompCode,的Int32 & pReason) 在IBM.WMQ.MQQueueManager.Connect(字符串queueManagerName) 在IBM.WMQ.MQQueueManager..ctor() 在Castle.Proxies.MQQueueManagerProxy。 .ctor(IInterceptor [])
大多数时候我运行它虽然我只是得到“函数评估超时”MQManMock.Object。
这是否意味着我不能模拟MQ?
看起来您实际上正在碰撞MQQueueManager。
你需要做什么把MQQueueManager放在你自己的接口后面(假设类本身没有实现一个接口)并使用Mock来构建该接口。
所以创建一个带有发送方法的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);
}
}
而且使用起订量来验证发送被称为