2010-12-01 144 views
1

我想单元测试我的项目的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?

回答

1

看起来您实际上正在碰撞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); 
    } 

} 

而且使用起订量来验证发送被称为

相关问题