博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
再写mock对象
阅读量:7241 次
发布时间:2019-06-29

本文共 3281 字,大约阅读时间需要 10 分钟。

上次写的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");            }        }    }}

转载于:https://www.cnblogs.com/code-style/archive/2012/11/17/2774309.html

你可能感兴趣的文章
Java 容器集合框架概览
查看>>
Linux echo命令
查看>>
用C#一步步创建Window Service (转)
查看>>
javascript library
查看>>
Mono 3.0.12 支持可移植类库
查看>>
js操作label,给label赋值,和取label的值
查看>>
MySQL主从复制与读写分离
查看>>
BZOJ 2049: [Sdoi2008]Cave 洞穴勘测 (动态树入门)
查看>>
解决/dev/fb0无法打开的问题
查看>>
勤快的程序猿都没啥前途的,赶紧改掉你的坏毛病吧!
查看>>
OpenCV学习(9) 分水岭算法(3)
查看>>
Android WebView漏洞(转)
查看>>
ExtJS4.2:自定义主题 入门
查看>>
【Android】事件输入系统-代码层次解读
查看>>
js 对文件操作
查看>>
MySQL 5.6学习笔记(数据表基本操作)
查看>>
复制控制---复制构造函数
查看>>
bash把所有屏幕输出重定向到文件并保持屏幕输出的方法
查看>>
HBase 压缩算法设置及修改
查看>>
深入了解jquery中的键盘事件
查看>>