2010-12-01 38 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); 
    } 

} 

而且使用起訂量來驗證發送被稱爲

相關問題