我正在尝试对我的项目的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 ??
答案 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验证发送是否被调用