Rhino Mocks (RhinoMock)2

发表于:2007-11-08 12:15

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:网络转载

        本文将介绍一款在.Net平台下的Mock工具---Rhino Mocks 2,以及相关Mock工具的一些比较.在了解到Rhino Mocks 2之前我也接触了一些其他Mock工具,比如EasyMockJMockNMockNMock2,不过最终还是选择了Rhino Mocks 2,相信你在看完本文的介绍后会和我做出同样的选择。(注:本文不是Mock工具的入门文章,如果你之前尚未接触了解有关Mock对象,请先去了解相关资料)
      
从一个例子说起:

   27  publicinterfaceISubscriber

   28     {

   29        intMultiplyTwo(inti);

   30        voidReceive(Object message);

   31     }

   32 

   33    publicclassPublisher

   34     {

   35        privateList<ISubscriber> subscribers =newList<ISubscriber>();

   36 

   37        publicvoidAdd(ISubscriber s)

   38         {

   39             subscribers.Add(s);

   40         }

   41 

   42        publicvoidPublish(objectmsg)

   43         {

   44             subscribers.ForEach(delegate(ISubscriber s) { s.Receive(msg); });

   45         }

   46        publicintCaculate(inti)

   47         {

   48            intresult = 0;

   49             subscribers.ForEach(delegate(ISubscriber s) { result += s.MultiplyTwo(i); });

   50            returnresult;

   51         }

   52     }

以上是一个Observer模式的小例子,为了更加全面的体现出Mock对象的特性,我在ISubscriber加了一个有返回值的方法MultiplyTwo,它所做的事情就是将参数乘2并返回.

        现在我们将对Publisher进行测试,然而Publisher中涉及到了另一个对象ISubscriber.而我们暂时还没实现ISubscriber,所以我们将利用Mock Object来完成我的测试.

下面是4Mock框架下的不同测试代码: 

EasyMock.Net

   55 namespaceEasyMockTest

   56 {

   57     [TestFixture]

   58    publicclassPublisherTest

   59     {

   60         [Test]

   61        publicvoidOneSubscriberReceivesAMessage()

   62         {

   63            //setup

   64             MockControl  mockCtrl= MockControl.CreateControl(typeof(ISubscriber));

   65             ISubscriber subMock = mockCtrl.GetMock()asISubscriber;

   66             Publisher publisher =newPublisher();

   67             publisher.Add(subMock);

   68            objectmessage =newobject();

   69 

   70            //record

   71             mockCtrl.Reset();

   72             subMock.Receive(message);

   73             subMock.MultiplyTwo(5);

   74             mockCtrl.SetReturnValue(10);

   75             mockCtrl.Replay();

   76 

   77            //execute

   78             publisher.Publish(message);

   79             Assert.AreEqual(10, publisher.Caculate(5));

   80 

   81            //verify

   82             mockCtrl.Verify();

   83         }

   84     }

   85 }

 

NMock

   55 namespaceNMockTest

   56 {

   57     [TestFixture]

   58    publicclassPublisherTest

   59     {

   60         [Test]

   61        publicvoidOneSubscriberReceivesAMessage()

   62         {

   63            // set up

   64             Mock mockSubscriber =newDynamicMock(typeof(ISubscriber));

   65             Publisher publisher =newPublisher();

   66             publisher.Add((ISubscriber)mockSubscriber.MockInstance);

   67            objectmessage =newObject();

   68 

   69            // expectations

   70             mockSubscriber.Expect("Receive", message);  //commentted is still ok

   71             mockSubscriber.ExpectAndReturn("MultiplyTwo", 10, 5);

   72 

   73            // execute

   74             publisher.Publish(message);

   75             Assert.AreEqual(10, publisher.Caculate(5));

   76 

   77            // verify

   78             mockSubscriber.Verify();

   79         }

   80     }

   81 }

 

NMock2

   55 namespaceNMock2Test

   56 {

   57     [TestFixture]

   58    publicclassPublisherTest

   59     {

   60         [Test]

   61        publicvoidOneSubscriberReceivesAMessage()

   62         {

   63            using(Mockery mocks =newMockery())

   64             {

   65                //setup

   66                 ISubscriber subMock = mocks.NewMock(typeof(ISubscriber))asISubscriber;

   67                 Publisher publisher =newPublisher();

   68                 publisher.Add(subMock);

   69                objectmessage =newobject();

   70 

   71                //expectations

   72                 Expect.Once.On(subMock).Method("Receive").With(message);

   73                 Expect.Once.On(subMock).Method("MultiplyTwo").With(5).Will(Return.Value(10));

   74 

   75                //excute<SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Ђ <

31/3123>
2023测试行业从业人员调查问卷已开启,千元大奖正在等你~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2023
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号