两个或是更多的类通过彼此的合作来实现业务逻辑,此过程中每个对象通过自身获取其合作对象的引用,造成了代码高耦合,难以测试。
   
    控制反转(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);
   
    }
   
    修改后的代码拆分成两个函数:内层函数通过传入的种子生成随机数,并以此调整顺序;外层函数只负责传入系统时间。单测时只测内层函数即可。