再写mock对象
上次写的mock对象的程序,其实并未真正的运行成功,因为当使用真正的业务对象从计算机真实的消息队列读取数据时,转换成为object类型传给使用程序时会产生一个异常(出现在把message.body转成object类型,说是没有匹配的格式对象),我设计意图是该消息队列读取类应该和读出的数据类型无关,它就是一个通用的处理程序,所以接口才会定成object,我不想违反自己的设计理念,加之是仓促为朋友写的代码,自己没有环境就放弃调试这个程序,何况上文重点是介绍,如何利用mock取代真实对象,但是最近还是想弄明白所以调试了一下,最新代码如下:
核心模块的代码
using System; using System.Text; using System.Threading; using System.Messaging; namespace QueueSpace { //外部依赖的接口,它屏蔽了mock对象和真对象 class Queue { //兼顾真正的业务处理程序,它需要elementType,mock对象不需要 public virtual object readMessage(Type elementType) { return null; } } //mock对象,模拟真对象的行为 class TestQueue : Queue { private int index = 0; private object[] Data = { "hello", "world" }; public override object readMessage(Type elementType) { while (index < Data.Length) { object data = Data[index]; index++; return data; } Thread.Sleep(60 * 60 * 60); return null; } } //真正的业务对象 class WorkQueue : Queue { MessageQueue queue = null; public WorkQueue() { string queueName = ".\\Private$\\TEST"; if (MessageQueue.Exists(queueName)) { queue = new MessageQueue(queueName); } else { queue = MessageQueue.Create(queueName, false); queue.SetPermissions("Everyone", MessageQueueAccessRights.FullControl); } } public override object readMessage(Type elementType) { //因为真正的处理代码需要elementType可以读出 System.Messaging.Message message = queue.Receive(); message.Formatter = new XmlMessageFormatter(new Type[] { elementType }); return (object)message.Body; } } //对象工厂 class QueueFactory { public static Queue makeQueue() { //return new TestQueue(); return new WorkQueue(); } } }
读取代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using QueueSpace; namespace QueueTest { class Program { static void Main(string[] args) { Queue queue = QueueFactory.makeQueue(); while (true) { //读取内置类型消息,无问题 object msg = queue.readMessage(typeof(string)); Console.WriteLine((int)msg); } } } }
写入模块
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Messaging; namespace PushMessage { class Program { static void Main(string[] args) { MessageQueue queue = null; string queueName = ".\\Private$\\TEST"; if (MessageQueue.Exists(queueName)) { queue = new MessageQueue(queueName); } else { queue = MessageQueue.Create(queueName, false); queue.SetPermissions("Everyone", MessageQueueAccessRights.FullControl); } for (int i = 0; i < 3;i++ ) { queue.Send("hello"); Console.WriteLine("write it"); } } } }