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 }
大致看来NMock2和RhinoMocks2比较相像, 尤其在创建Mock对象的时候, 这点也是较之EasyMock和NMock比较合理的地方, 因为你只需一个MockRepository就可以创建出多个Mock Object, 并且可以直接获得该类型的对象, 不需要再用mock.GetMock().这样的方法来获得所需的Mock对象.并且它们都利用using block增加方便性.(在using block结束的时候会调用using对象的Dispose方法,此时将会自动调用mocks.VerifyAll(), 不需要象EasyMock和NMock那样显式调用Verify方法.)
而NMock2和RhinoMocks2的区别主要在于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). 你可以看到RhinoMocks2的76行使用了mocks.ReplayAll(); 而NMock2并没有调用该方法. NMock2和JMock都采用了Expectation的模型, 所有的期望发生的方法都使用Expect来定义.所以导致了它们之间的不同. 而RhinoMocks2就是结合两者的优点使得你既能获得类型安全又能使用类似Expect的简洁语法.