依赖注入在单测中的应用
上一篇 /
下一篇 2012-07-22 13:43:47
/ 个人分类:单元测试
在面向对象的程序里面,某一功能通常需要若干组件共同来完成,比如一个类的方法可能需要另外一个类的接口来协助完成,比如类A里面包括类B的实例。这样传统hard
code的实现方式,不仅耦合大,扩展性也差,从单测角度来说也是困难的。此类问题,可以通过依赖注入方式来解决。即可理解为高层模块不应依赖于低层模块,高层与低层都应依赖抽象;抽象也不应当依赖于细节,细节应依赖于抽象。
如下面的例子,单测实例化对象困难,
class Score{ public: Score(){ _clp = new Student(); } float GetScore (){ float result = 0; result = _clp->GetAllScore(); return result; } private: Student* _clp; } |
//测试GetScore函数 TEST(test_ GetScore, BoundaryTesting){ SCORE myScore; //sorry, you can’t! it need some real environments for Student EXPECT_TRUE(1.4 == myScore. GetScore ()); } |
改良后的函数:
class Score { public: Score(){ } float GetScore (Student* clg){ float result = 0; result = clp->GetAllScore(); return result; } } //要求Student的GetAllScore应为虚函数//Setter Injection是指为SCORE增加set方法来初始化成员_clp;Constructor
Injection指通过参数构造函数方式来初始化_clp。 |
//测试SCORE的GetScore函数 TEST(test_GetScore,BoundaryTesting){ Score myScore; //cool, you can do it! Student * clg =new StudentMock; //yes, you can mock it,省略mock代码 EXPECT_TRUE(1.4 == myScore. GetScore (clg)); } |
收藏
举报
TAG: