RhinoMock入门(3)——4种Mock类型
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
作者: 梅樺 發(fā)表于 2010-05-10 11:15 原文鏈接 閱讀: 143 評(píng)論: 1
MockRespository有四種泛型方法:
·CreateMock
·CreateDynamicMock
·PartialMock
·Stub
在3.5中,三種已經(jīng)過時(shí)的方法分別由以下方法替代:
·StrictMock
·DynamicMock
·PartialMock
·Stub
它們各自對(duì)應(yīng)靜態(tài)工廠方法:
·MockRepository.GenerateStrictMock
·MockRepository.GenerateMock
·MockRepository.GeneratePartialMock
·MockRepository.GenerateStub?
?
(1)StrictMock
通過這個(gè)方法可以創(chuàng)建一個(gè)具有嚴(yán)格語義的T類型mock對(duì)象,如果在使用過程中沒有顯式的對(duì)過程進(jìn)行錄制,則會(huì)出錯(cuò)誤,并會(huì)拋出異常。
例如:
[Test]public ? void ?TestStrictMock()
{
????MockRepository?mocks? = ? new ?MockRepository();
????ICustomer?customer? = ?mocks.StrictMock < ICustomer > ();
????customer.Replay();
????customer.ShowTitle( "" );
????mocks.VerifyAll();
}
??
這里沒有對(duì)customer的ShowTitle方法顯式地安裝期望, 而mock對(duì)象又是具有嚴(yán)格語義的對(duì)象,所以這里會(huì)發(fā)生錯(cuò)誤,而拋出異常。?
(2)DynamicMock
通過這個(gè)方法可以創(chuàng)建一個(gè)具有動(dòng)態(tài)語義的T類型mock對(duì)象,如果在使用過種中沒有顯式的對(duì)過程進(jìn)行錄制,則不會(huì)出現(xiàn)異常。如果方法有返回值,那么會(huì)返回null或0。
同樣以上個(gè)例子來說:
public ? void ?TestDynamicMock(){
????MockRepository?mocks? = ? new ?MockRepository();
????ICustomer?customer? = ?mocks.DynamicMock < ICustomer > ();
????customer.Replay();
????customer.ShowTitle( "" );
????mocks.VerifyAll();????
}
??
這里同樣沒有進(jìn)行顯式的安裝期望,但不會(huì)出現(xiàn)錯(cuò)誤,不會(huì)拋出異常。所以當(dāng)使用動(dòng)態(tài)語義模擬對(duì)象時(shí),沒有顯式安裝期望的方法會(huì)被忽略。?
(3)PartialMock
可以模擬類的一部分。可以獨(dú)立測(cè)試抽象方法。它只能用于類。加一官方描述的話:如果方法上沒有設(shè)置期望的值,就從一個(gè)調(diào)用類方法的默認(rèn)類上去創(chuàng)建一個(gè)Mock對(duì)象。
現(xiàn)在用例子來說明一下,這個(gè)例子通過抽象類來進(jìn)行,抽象類中有一模板方法,而其中的方法是個(gè)抽象的,這里通過官網(wǎng)提供的例子來進(jìn)行:
?
public ? abstract ? class ?ProcessorBase{
???? public ? int ?Register;
???? public ? virtual ? int ?Inc()
????{
??????Register? = ?Add( 1 );
?????? return ?Register;
????}
???? public ? abstract ? int ?Add( int ?i);
}
??
[Test]
public ? void ?TestPartialMock()
{
????MockRepository?mocks? = ? new ?MockRepository();
????ProcessorBase?proc? = ?mocks.PartialMock < ProcessorBase > ();
???? using ?(mocks.Record())
????{
????????Expect.Call(proc.Add( 1 )).Return( 1 );
????????Expect.Call(proc.Add( 1 )).Return( 2 );
????}???
????proc.Inc();
????Assert.AreEqual( 1 ,?proc.Register);
????proc.Inc();
????Assert.AreEqual( 2 ,?proc.Register);
????mocks.VerifyAll();
}
??
(4)Stub
直接以例子進(jìn)行
public ? interface ?IAnimal{
???? int ?Legs?{? get ;? set ;?}
???? int ?Eyes?{? get ;? set ;?}
???? string ?Name?{? get ;? set ;?}
???? string ?Species?{? get ;? set ;?}
???? event ?EventHandler?Hungry;
???? string ?GetMood();
}
public ? class ?AnimalTest
{
???IAnimal?_animal;
??? public ?AnimalTest(IAnimal?animal)
???{
???????_animal? = ?animal;
???}
??? public ? void ?SetLegs( int ?count)
???{
???????_animal.Legs? = ?count;
???}
}
??
測(cè)試:
[Test]public ? void ?CreateAnimalStub()
{
????MockRepository?mocks? = ? new ?MockRepository();
????IAnimal?animal? = ?mocks.DynamicMock < IAnimal > ();
????Expect.Call(animal.Legs).PropertyBehavior();
????Expect.Call(animal.Eyes).PropertyBehavior();
????Expect.Call(animal.Name).PropertyBehavior();
????Expect.Call(animal.Species).PropertyBehavior();?
????AnimalTest?aa? = ? new ?AnimalTest(animal);
????aa.SetLegs( 10 );
????Assert.AreEqual( 10 ,?animal.Legs);
}
??
設(shè)置接口屬性行為,可以在實(shí)例中使用。這個(gè)屬性行為可以通過Stub來設(shè)置,那就簡(jiǎn)單了:
[Test]public ? void ?CreateAnimalStub()
{
????MockRepository?mocks? = ? new ?MockRepository();
????IAnimal?animal? = ?mocks.Stub < IAnimal > ();?
????AnimalTest?aa? = ? new ?AnimalTest(animal);
????aa.SetLegs( 10 );
????Assert.AreEqual( 10 ,?animal.Legs);
}
??
當(dāng)然,也可利用反射來封裝對(duì)象屬性行為設(shè)置mock對(duì)象的所有屬性:
public ? void ?SetPropertyBehaviorOnAllProperties( object ?mock)
{
????PropertyInfo[]?properties? = ?mock.GetType().GetProperties();
???? foreach ?(PropertyInfo?property? in ?properties)
????{
??????? if (property.CanRead? && ?property.CanWrite)
???????{
??????????property.GetValue(mock,? null );
??????????LastCall.On(mock).PropertyBehavior();
???????}
????}
}
??
從這里看出Stub是多么的方便。?
評(píng)論: 1 查看評(píng)論 發(fā)表評(píng)論
程序員找工作,就在博客園
最新新聞:
· 電子商務(wù)網(wǎng)站之信任度(2010-10-09 17:02)
· 馬云:管理的核心在于“抓住人性的本真”(2010-10-09 16:52)
· 另一 Windows Phone Live 主頁截圖現(xiàn)身 Windows Phone 7 視頻(2010-10-09 16:38)
· 谷歌首名員工:公司成功歸結(jié)于運(yùn)氣不錯(cuò)(2010-10-09 16:32)
· 神奇小子Geohot帶著“l(fā)imera1n”回歸(2010-10-09 16:29)
編輯推薦:遠(yuǎn)離.NET
網(wǎng)站導(dǎo)航:博客園首頁??個(gè)人主頁??新聞??閃存??小組??博問??社區(qū)??知識(shí)庫
轉(zhuǎn)載于:https://my.oschina.net/jams742003/blog/8849
總結(jié)
以上是生活随笔為你收集整理的RhinoMock入门(3)——4种Mock类型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 纯JS幻动片
- 下一篇: 2.1 网站防******与企业虚拟化需