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来完成我的测试.
下面是4种Mock框架下的不同测试代码:
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: Ђ <