RhinoMock入门(3)——4种Mock类型
2019獨角獸企業重金招聘Python工程師標準>>>
作者: 梅樺 發表于 2010-05-10 11:15 原文鏈接 閱讀: 143 評論: 1
MockRespository有四種泛型方法:
·CreateMock
·CreateDynamicMock
·PartialMock
·Stub
在3.5中,三種已經過時的方法分別由以下方法替代:
·StrictMock
·DynamicMock
·PartialMock
·Stub
它們各自對應靜態工廠方法:
·MockRepository.GenerateStrictMock
·MockRepository.GenerateMock
·MockRepository.GeneratePartialMock
·MockRepository.GenerateStub?
?
(1)StrictMock
通過這個方法可以創建一個具有嚴格語義的T類型mock對象,如果在使用過程中沒有顯式的對過程進行錄制,則會出錯誤,并會拋出異常。
例如:
[Test]public ? void ?TestStrictMock()
{
????MockRepository?mocks? = ? new ?MockRepository();
????ICustomer?customer? = ?mocks.StrictMock < ICustomer > ();
????customer.Replay();
????customer.ShowTitle( "" );
????mocks.VerifyAll();
}
??
這里沒有對customer的ShowTitle方法顯式地安裝期望, 而mock對象又是具有嚴格語義的對象,所以這里會發生錯誤,而拋出異常。?
(2)DynamicMock
通過這個方法可以創建一個具有動態語義的T類型mock對象,如果在使用過種中沒有顯式的對過程進行錄制,則不會出現異常。如果方法有返回值,那么會返回null或0。
同樣以上個例子來說:
public ? void ?TestDynamicMock(){
????MockRepository?mocks? = ? new ?MockRepository();
????ICustomer?customer? = ?mocks.DynamicMock < ICustomer > ();
????customer.Replay();
????customer.ShowTitle( "" );
????mocks.VerifyAll();????
}
??
這里同樣沒有進行顯式的安裝期望,但不會出現錯誤,不會拋出異常。所以當使用動態語義模擬對象時,沒有顯式安裝期望的方法會被忽略。?
(3)PartialMock
可以模擬類的一部分。可以獨立測試抽象方法。它只能用于類。加一官方描述的話:如果方法上沒有設置期望的值,就從一個調用類方法的默認類上去創建一個Mock對象。
現在用例子來說明一下,這個例子通過抽象類來進行,抽象類中有一模板方法,而其中的方法是個抽象的,這里通過官網提供的例子來進行:
?
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
直接以例子進行
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;
???}
}
??
測試:
[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);
}
??
設置接口屬性行為,可以在實例中使用。這個屬性行為可以通過Stub來設置,那就簡單了:
[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);
}
??
當然,也可利用反射來封裝對象屬性行為設置mock對象的所有屬性:
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是多么的方便。?
評論: 1 查看評論 發表評論
程序員找工作,就在博客園
最新新聞:
· 電子商務網站之信任度(2010-10-09 17:02)
· 馬云:管理的核心在于“抓住人性的本真”(2010-10-09 16:52)
· 另一 Windows Phone Live 主頁截圖現身 Windows Phone 7 視頻(2010-10-09 16:38)
· 谷歌首名員工:公司成功歸結于運氣不錯(2010-10-09 16:32)
· 神奇小子Geohot帶著“limera1n”回歸(2010-10-09 16:29)
編輯推薦:遠離.NET
網站導航:博客園首頁??個人主頁??新聞??閃存??小組??博問??社區??知識庫
轉載于:https://my.oschina.net/jams742003/blog/8849
總結
以上是生活随笔為你收集整理的RhinoMock入门(3)——4种Mock类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 纯JS幻动片
- 下一篇: 2.1 网站防******与企业虚拟化需