依赖注入在单测中的应用

上一篇 / 下一篇  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;

}

}

//要求StudentGetAllScore应为虚函数//Setter Injection是指为SCORE增加set方法来初始化成员_clpConstructor Injection指通过参数构造函数方式来初始化_clp

 

 //测试SCOREGetScore函数

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:

 

评分:0

我来说两句

Open Toolbar