模拟在函数内部创建的外部依赖对象,而无需在C ++中注入依赖

问题描述

我试图用C ++编写单元测试,并且遇到了使用Fakeit为外部依赖项创建模拟对象的问题。因此,我们有一个类似于以下内容的类:

class A 
{
    int test_method()
    {
        B obj;
        return obj.sendInt()
    }
};

class B
{
    int sendInt()
    {
        return 5;
    }
};

现在让我们说我想为类test_method()的{​​{1}}编写单元测试。当我们调用A时,我想模拟它并返回一个不同的值。我尝试使用fakeit,但无法找到解决方案。

我知道,如果我们尝试通过构造函数或setter方法进行obj.sendInt()的依赖项注入将解决,但是我不想这样做,因为它会在{的现有使用者中进行一些重构{1}}。

对于Java中的类似情况,我将使用powermockito并使用B

A

解决方法

最简单的方法是使用依赖注入。我认为C ++没有类似于PowerMockito的东西(例如,不可能像PowerMockito允许Java那样模拟静态方法/函数)。

如果问题仅在于通过ctor或setter方法进行依赖项注入,请考虑使用hi-perf dependency injection,即使用模板注入模拟。

如果class A根本无法修改,但您拥有class B,请考虑将class B移至单独的静态库:一个用于生产的库(例如libBprod)一个用于测试(libBtest)。在生产中,您可以链接到libBprod,在测试中可以链接到libBtest。在libBtest中,您可以将class B设为单例。不过,这是很多工作。

如果class Aclass B都无法修改,那么我就没主意了-您需要以某种方式重构部分代码。

,

我将初始化B的代码移动到了私有方法,并使用gmock模拟了该私有方法

def collatz_s(num):
    while num != 1:
        if num in even:
            result = num // 2
            print(result)
            num = result

        elif num in odd:
            result = num * 3 + 1
            print(result)
            num = result



num = int(input('choose a random number'))
collatz_s(num) 
# input 5
# output 

16
8
4
2
1

我的测试方法看起来像

class A 
{

int test_method()
{
return getBValue();
}
int getBValue()
{
B obj;
return obj.sendInt()
}

}