依赖注入在单元测试中的应用

上一篇 / 下一篇  2012-07-05 08:38:19 / 个人分类:单元测试

两个或是更多的类通过彼此的合作来实现业务逻辑,此过程中每个对象通过自身获取其合作对象的引用,造成了代码高耦合,难以测试

控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则,用来削减计算机程序的耦合问题。控制反转还有一个名字叫做依赖注入(Dependency Injection)。简称DI

应用控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用,传递给它。也可以说,依赖被注入到对象中。本文描述了一种依赖注入法在实际测试过程中的应用。

如果被测对象依赖于不可预期的行为,那么其结果往往无法或难以预知。如“被测函数依赖系统时间”这种情况。

被测函数的功能为:取当前系统时间作为随机种子,利用随机数调整数组内元素的顺序。本函数单测的难点在于结果的验证上:存在一定概率,调整后顺序不变。

void reorder(
bsl::deque<uint32_t> &deque)
{
srand(getCurTime());
for (int indexLeft = 0;
indexLeft < deque.size();
++indexLeft)
{
int indexRight = rand()% (deque.size()-indexLeft);
swap(deque[indexLeft],
deque[indexRight]);
}
}
旧的测试代码
注:下面的测试代码存在一定概率使断言失败
TEST_OLD(test_reorder_suite,should_reorder_deque_randomly)
{
bsl::deque<uint32_t> deque;
deque.push_back(1);
deque.push_back(2);
reorder(deque);
EXPECT_EQ(deque[0], 2);
EXPECT_EQ(deque[1], 1);
}

修改后的代码
// 从reorder()中抽离出的函数
void reorder_by_seed(uint32_t seed,
bsl::deque<uint32_t> &deque)
{
srand(seed);
for (int indexLeft = 0;
indexLeft < deque.size();
++indexLeft)
{
int indexRight = rand()
% (deque.size()-indexLeft);
swap(deque[indexLeft],
deque[indexRight]);
}
}
void reorder(
bsl::deque<uint32t> &deque)
{
reorder_by_seed(getCurTime(),
deque);
}
修改后的测试代码
TEST_NEW(test_reorder_by_seed_suite,
should_reorder_deque_by_seed_randomly)
{
bsl::deque<uint32_t> deque;
deque.push_back(1);
deque.push_back(2);
uint32_t seed = 12;
reorder_by_seed(seed, deque);
EXPECT_EQ(deque[0], 2);
EXPECT_EQ(deque[1], 1);
}

修改后的代码拆分成两个函数:内层函数通过传入的种子生成随机数,并以此调整顺序;外层函数只负责传入系统时间。单测时只测内层函数即可。



 

 


TAG:

 

评分:0

我来说两句

Open Toolbar