日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

TDD Tip:方法内部New出来的对象如何Mock

發布時間:2025/4/5 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TDD Tip:方法内部New出来的对象如何Mock 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

解決的問題:方法內部new的對象在測試時希望能夠用mock對象去代替。

問題:以下方法可以解決,但是很是丑陋,各位大俠是否有更好的方法?

描述:如果說把內部的方法放到類的一個公開成員變量,或者放到方法的參數里,我的意見是公開了不應該公開的東西。

使用第三方的類庫: Mock工具 Rhino.Mocks, IOC: Castle.Windsor

1. 現在我又這么一段代碼,我想測試Math內部這兩個方法

????public??class?Math

??? {

????????public?long?MathAdd(int?a,?int?b)

??????? {

????????????Calc?c =?new?Calc();???????????

????????????return?c.Add(a, b);

??????? }

?

????????public?long?MathAdd2Price(int?a)

??????? {

????????????Calc?c =?new?Calc();

????????????return?c.AddCount(a) + c.count;

??????? }

??? }

?

????public?class?Calc

??? {

????????public?int?count = 0;

????????public?long?Add(int?a,?int?b)

??????? {

????????????return?a + b;

??????? }

?

????????public?long?AddCount(int?num)

??????? {

????????????return?count + num;

??????? }

??? }

?

2. 我們看到,由于是在內部new的對象,我們就對Calc類產生了很大的依賴,于是我想到注入一個對像,下面是我的設計

?

?? public?class?ContainerFactory

??? {

????????public static?IWindsorContainer?container;

????????public?bool?IsDebug =?false;

????????private?static?readonly?ContainerFactory?instance =?new?ContainerFactory();

?

????????public?static?ContainerFactory?Instance

??????? {

????????????get

??????????? {

????????????????return?instance;

??????????? }

??????? }

?

????????private?ContainerFactory()

??????? {

??????????? AddAllCompent();

??????? }

?

????????private?void?AddAllCompent()

??????? {

????????????if?(container ==?null)

??????????? {

??????????????? container =?new?WindsorContainer();

????????????????//此處職位演示,未使用接口

??????????????? container.AddComponentWithLifestyle<Calc>("Calc",?LifestyleType.Transient);??????????? }

??????? }

}

這樣我們的Math類可改成這樣

??public??class?Math

??? {

????????public?long?MathAdd(int?a,?int?b)

??????? {

???????????// Calc c = new Calc();

????????????Calc?c =(Calc)?ContainerFactory.container["Calc"];

????????????return?c.Add(a, b);

??????? }

?

????????public?long?MathAdd2Price(int?a)

??????? {

????????????Calc?c = (Calc)ContainerFactory.container["Calc"];

????????????return?c.AddCount(a) + c.count;

??????? }

?

??? }

?

3.? 但是,我們如何在測試中用我們Mock的對象代替真實的對象呢?下面是我想的一個自己也認為不好的方法,但能湊活著用

?public?class?ContainerFactory

??? {

????????private?IWindsorContainer?container;

????????public?bool?IsDebug =?false;

????????private?static?readonly?ContainerFactory?instance =?new?ContainerFactory();

?

????????public?static?ContainerFactory?Instance

??????? {

????????????get

??????????? {

????????????????return?instance;

??????????? }

??????? }

?

????????private?ContainerFactory()

??????? {

??????????? AddAllCompent();

??????? }

?

????????private?void?AddAllCompent()

??????? {

????????????if?(container ==?null)

??????????? {

??????????????? container =?new?WindsorContainer();

????????????????//此處職位演示,未使用接口

??????????????? container.AddComponentWithLifestyle<Calc>("Calc",?LifestyleType.Transient);??????????? }

??????? }

?

??????? #region?Calc

????????private?Calc?DebugCalc;

????????public?Calc??? Calc

??????? {

????????????get

??????????? {

????????????????if?(IsDebug && DebugCalc !=?null)

??????????????? {

????????????????????return?DebugCalc;

??????????????? }

????????????????else

??????????????? {

????????????????????return?(Calc)container["Calc"];

??????????????? }

??????????? }

????????????set

??????????? {

????????????????// just for test, for mock object

????????????????if?(IsDebug)

??????????????? {

??????????????????? DebugCalc =?value;

??????????????? }

????????????????else

??????????????? {

????????????????????throw?new?Exception("just for test");

??????????????? }

??????????? }

??????? }

??????? #endregion?

??? }

修改我們的類

??public??class?Math

??? {

????????public?long?MathAdd(int?a,?int?b)

??????? {

???????????// Calc c = new Calc();

????????????Calc?c =?ContainerFactory.Instance.Calc;

????????????return?c.Add(a, b);

??????? }

?

????????public?long?MathAdd2Price(int?a)

??????? {

????????????Calc?c =?ContainerFactory.Instance.Calc;

????????????return?c.AddCount(a) + c.count;

??????? }

?

??? }

?

這樣我們來看我們通過了測試的代碼

[TestClass()]

????public?class?MathTest

??? {

??????? [TestMethod()]

????????public?void?MathAddTest()

??????? {

????????????Math?m =?new?Math();

?

????????????// 想讓真實代碼內部,使用的是Mock的對象

????????????// Arrange

????????????MockRepository?mocks =?new?MockRepository();

????????????Calc?mockCalc = mocks.Stub<Calc>();

??????????? mockCalc.count = 5;

????????????ContainerFactory.Instance.IsDebug =?true; //這句很重要

????????????ContainerFactory.Instance.Calc = mockCalc;

?

??????????? mocks.ReplayAll();

????????????// Act

????????????Assert.AreEqual(m.MathAdd(5, 5), 10);

????????????Assert.AreEqual(mockCalc.AddCount(6), 11);

??????????? mocks.VerifyAll();

?

????????????Calc?mockCalc2 = mocks.Stub<Calc>();

??????????? mocks.ReplayAll();

?

????????????// 這里有問題,我們希望他是7,但實際是12,因為需要測試中的和實際代碼用同一個對象,

????????????// 他保留上次的狀態count的值5

????????????Assert.AreEqual(mockCalc.AddCount(7), 12);

??????????? mocks.VerifyAll();???????????

??????? }

?

??????? [TestMethod]

????public?void?MathAddTestActual()

??? {

????????????//這里測試實際使用代碼,沒用Mock

????????Math?m =?new?Math();

????????Assert.AreEqual(m.MathAdd(5,6), 11);

????????Assert.AreEqual(m.MathAdd2Price(9), 9);

????????Calc?c =?ContainerFactory.Instance.Calc;

????????Assert.AreEqual(c.AddCount(5), 5);

??????? c.count = 20;

????????Assert.AreEqual(c.AddCount(5), 25);

????????Calc?d =?ContainerFactory.Instance.Calc;

????????Assert.AreEqual(d.AddCount(30), 30);

????????Assert.AreEqual(c.count, 20);

????????Assert.AreEqual(d.count, 0);

??? }

??? }

?

?

總結:這樣可以不使用用public的類成員變量,不用通過方法參數注入注入對象

?

問題:? ContainerFactory代碼較多,測試時需要設標志。

?

其它的問題: 等待高人指出,謝謝!

本文轉自敏捷的水博客園博客,原文鏈接http://www.cnblogs.com/cnblogsfans/archive/2008/12/16/1355640.html如需轉載請自行聯系原作者


王德水

總結

以上是生活随笔為你收集整理的TDD Tip:方法内部New出来的对象如何Mock的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 人人爱爱 | 爱涩av | 少妇人妻一区二区 | 亚洲日日骚 | 99re6在线 | 国产精品乱码一区二区三区 | 日韩国产欧美一区二区三区 | av综合站 | 亚洲午夜在线 | 永久免费av无码网站性色av | 天堂av亚洲av国产av电影 | 激情视频国产 | 成人欧美精品一区二区 | 欧洲综合视频 | 日本在线视频二区 | 亚洲乱码日产精品bd在线观看 | 韩国av在线免费观看 | 国产视频97 | 亚洲精品网址 | 亚洲综合视频在线 | 另类尿喷潮videofree | 国产精品5| 久久九九色 | 麻豆国产av超爽剧情系列 | 小草av| 黄色美女毛片 | 91精品国产福利在线观看 | 日批免费在线观看 | 日韩污视频在线观看 | 日韩经典三级 | 聚色av| a级片在线| 97国产视频 | 国产又粗又大又黄 | 中文天堂在线观看 | 色眯眯网| 天天躁日日躁狠狠躁av麻豆 | 蜜桃av噜噜一区二区三区 | 色婷婷精品久久二区二区密 | 激情小视频在线观看 | 无码精品a∨在线观看中文 福利片av | 欧美色999| 日韩av中字| 致命弯道8在线观看免费高清完整 | 亚洲午夜视频 | 日本黄页网站 | 96精品视频 | 精品盗摄一区二区三区 | 日韩精品影视 | 欧美日韩小说 | 国产视频1区2区3区 国产欧美一区二区精品性色99 | 最新av不卡 | 欧美成人精品欧美一级 | 日韩欧美在线视频观看 | 国产一二三 | 在线播放成人av | 国产又黄又嫩又滑又白 | 麻豆影视国产在线观看 | 亚洲欧美国产一区二区 | av最新版天堂资源在线 | 欧洲熟妇的性久久久久久 | 久久久老熟女一区二区三区91 | 国产精品无码免费播放 | 夜夜操夜夜爱 | av导航站| 蜜臀视频一区二区三区 | 一区二区三区视频播放 | 亚洲精品福利在线观看 | 日韩毛片在线 | 久久久久久欧美精品se一二三四 | 欧美精品v| 免费视频色 | 日本天堂在线播放 | 青青草原av在线 | 女生喷液视频 | 国产成人av免费看 | 久久少妇视频 | 成人性做爰aaa片免费 | av色区| 欧美日韩视频一区二区 | 亚洲av片在线观看 | 男人插入女人下面的视频 | 国产黄色大片在线观看 | 91九色视频在线 | 女人扒开屁股让男人捅 | 又粗又猛又爽又黄少妇视频网站 | av片免费播放 | xxsm.com| 国产成人精品一区二区三区网站观看 | 日韩视频免费观看 | 久草资源在线 | 秋霞中文字幕 | 713电影免费播放国语 | 欧美久久一区 | 岛国午夜视频 | 亚洲综合插 | 69亚洲| 狠狠的日 | 人人综合网 |