Rhino Mocks (RhinoMock)2

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

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

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

RhinoMocks2

   55 namespace RhinoMocks2Test

   56 {

   57     [TestFixture]

   58     public class PublisherTest

   59     {

   60         [Test]

   61         public void OneSubscriberReceivesAMessage()

   62         {

   63             using (MockRepository mocks = new MockRepository())

   64             {

   65                 //setup

   66                 ISubscriber subMock = mocks.CreateMock(typeof(ISubscriber)) as ISubscriber;

   67                 Publisher publisher = new Publisher();

   68                 publisher.Add(subMock);

   69                 object message = new object();

   70 

   71                 //record with expectation model

   72                 subMock.Receive(message);

   73                 Expect.On(subMock).Call(subMock.MultiplyTwo(5)).Return(10);

   74 

   75                 //end record

   76                 mocks.ReplayAll();

   77 

   78                 //excute

   79                 publisher.Publish(message);

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

   81             }//verify when mocks dispose

   82         }

   83     }

   84 }

       大致看来NMock2RhinoMocks2比较相像, 尤其在创建Mock对象的时候, 这点也是较之EasyMockNMock比较合理的地方, 因为你只需一个MockRepository就可以创建出多个Mock Object, 并且可以直接获得该类型的对象, 不需要再用mock.GetMock().这样的方法来获得所需的Mock对象.并且它们都利用using block增加方便性.(using block结束的时候会调用using对象的Dispose方法,此时将会自动调用mocks.VerifyAll(), 不需要象EasyMockNMock那样显式调用Verify方法.)

NMock2RhinoMocks2的区别主要在于Expectation阶段.

仅仅从语法上来看, 你会发现它们都使用了Expectation的语法, 但是RhinoMocks2显然更胜一筹.                

 

void Receive(Object message);

NMock2

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

RhinoMocks2

subMock.Receive(message);

RhinoMocks2的语法非常简洁也更加自然. 不过如果之前一直使用Expectation语法的可能会觉得奇怪, 怎么把方法的执行放到了Expectation阶段. 注意到RhinoMocks2的这个特点,你就会觉得很自然了, 对于没有返回值的方法RhinoMocks2是这样处理的.

mock.Method(Parameter p);
       LastCall.On(mock);

不过LastCall.On(mock);可以被省略.RhinoMocks2会自动为你补上.

再来看看对于有返回值的方法的处理:

 

int MultiplyTwo(int i);

NMock2

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

RhinoMocks2

Expect.On(subMock).Call(subMock.MultiplyTwo(5)).Return(10);

简而言之,RhinoMocks2是类型安全的. NMock2中使用的是字符串型的方法名,这样既没有了IDE自动完成的支持,而且要在测试运行时才能检查出错误. 并且对于参数和返回值的语法也是RhinoMocks2处理的更加简洁,自然.

为什么NMock2甚至JMock没有使用类型安全的语法? 不是它们没有想到,而是由于它们和RhinoMocks2采取的实现模型是不一样的. EasyMock.Net RhinoMocks2采用的是Record/Replay的模型,即先记录Record将会发生的事, 然后在回放(Replay). 你可以看到RhinoMocks276行使用了mocks.ReplayAll(); NMock2并没有调用该方法. NMock2JMock都采用了Expectation的模型, 所有的期望发生的方法都使用Expect来定义.所以导致了它们之间的不同. RhinoMocks2就是结合两者的优点使得你既能获得类型安全又能使用类似Expect的简洁语法.

32/3<123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号